2013-02-11 23 views
5

Bir web görüntüleyicim var ve sadece webapps'larımıza erişebilmeyi istiyorum, bunu başarmak için Qt Uygulamamda aradığım bir php başlığını yerleştirdim. Bu iyi çalışıyor, ancak bir istisna ile ve 301 kalıcı taşınan durum kodları ile. Modern tarayıcılar sizi otomatik olarak yönlendirir, ancak http isteğinin sonuna bir "/" koymaktadır.QNetworkReply ve 301 yönlendirmesi

Web uygulamamıza bir URL girildiğinde, üstbilgileri algılayabilmeniz için izleyen eğik çizgiye ihtiyaç duyuyor, ancak izleyen bir eğik çizgi koymasa bile bu üstbilgiye ulaşmasını istiyorum. İşte

başlığı almak için benim şimdiki yöntemdir:

QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    QNetworkRequest request; 
    request.setUrl(url); 
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*))); 

    request.setRawHeader("User-Agent", "CytoViewer 1.0"); 
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/CytoViewer"); 
    QNetworkReply *reply = manager->get(request); 
    reply->ignoreSslErrors(); 
    QEventLoop loop; 

    connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); 
    loop.exec(); 
    qDebug() << "QLoop reply all: " << reply->readAll(); 
    qDebug() << "QLoop: " << reply->rawHeader("Cyto-Study-Manager"); 
    if(reply->rawHeader("OurWebApp") == "1"){ 
     //Header exists?(QEventLoop finish) Set arg[1]"url 'Found prouct: product header'" 
     product = reply->rawHeader("Product"); 
     return true; 
    } else { 
     //Header doen't exist? Graceful error - not a valid PI product 
     return false; 
    } 

İki ağ isteklerini göndermek ilk bir 301 vurma sorununu çözmek için, birincisi URL girildi ve 301 olmadığını kontrol vurur reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); yöntemi ile önerilen URL'yi alması gereken 301 durum kodu vardır ve durum kodu yoksa bu URL'yi döndürür, daha sonra kullanıcının girdiği önceki URL'yi döndürür ve sonra üstbilgileri kontrol etmek için başka bir ağ isteği gönderir. Ben durum kodu kontrol etmek için dışarı göndermek

İlk istek:

QUrl MainWindow::networkRequest(QUrl checkUrl){ 
    qDebug() << "checkURL: " << checkUrl; 
    // 
    QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    QNetworkRequest request; 
    request.setUrl(checkUrl); 
    request.setRawHeader("User-Agent", "CytoViewer 1.0"); 
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/CytoViewer"); 
    QNetworkReply *reply = manager->get(request); 
    reply->ignoreSslErrors(); 
    QEventLoop checkLoop; 
    connect(reply, SIGNAL(finished()), &checkLoop, SLOT(quit())); 
    checkLoop.exec(); 
    //Check status code 
    if (reply->error() == QNetworkReply::NoError) { 
     int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
     if(statusCode == 301) { 
      QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); 
      return redirectUrl; 
     }else { 
      return checkUrl; 
     } 

    } 
} 

Uzun lafın kısası, ben iki ağ isteklerini yolluyorum, 1) bizim app başlığında kontrol etmek için 301 2) denetlemek için.

Tek bir istekte bunu yapmak için zaten var mı? Bu yönlendirme işlemini otomatik olarak yapacak bir yöntem eksik mi?

Selamlar

Nathan

cevap

9

Görünüşe yoktur. Yukarıdaki bağlantıdan

http://developer.nokia.com/community/wiki/Handling_an_HTTP_redirect_with_QNetworkAccessManager günü resmi NASIL girişi (ölü bağlantı maalesef) yoktur

Ekstraksiyon:

void QNAMRedirect::replyFinished(QNetworkReply* reply) { 
    /* 
    * Reply is finished! 
    * We'll ask for the reply about the Redirection attribute 
    * http://doc.trolltech.com/qnetworkrequest.html#Attribute-enum 
    */ 
    QVariant possibleRedirectUrl = 
      reply->attribute(QNetworkRequest::RedirectionTargetAttribute); 

    /* We'll deduct if the redirection is valid in the redirectUrl function */ 
    _urlRedirectedTo = this->redirectUrl(possibleRedirectUrl.toUrl(), 
             _urlRedirectedTo); 

    /* If the URL is not empty, we're being redirected. */ 
    if(!_urlRedirectedTo.isEmpty()) { 
     QString text = QString("QNAMRedirect::replyFinished: Redirected to ") 
           .append(_urlRedirectedTo.toString()); 
     this->_textContainer->setText(text); 

     /* We'll do another request to the redirection url. */ 
     this->_qnam->get(QNetworkRequest(_urlRedirectedTo)); 
    } 
    else { 
     /* 
     * We weren't redirected anymore 
     * so we arrived to the final destination... 
     */ 
     QString text = QString("QNAMRedirect::replyFinished: Arrived to ") 
           .append(reply->url().toString()); 
     this->_textContainer->setText(text); 
     /* ...so this can be cleared. */ 
     _urlRedirectedTo.clear(); 
    } 
    /* Clean up. */ 
    reply->deleteLater(); 
} 

QUrl QNAMRedirect::redirectUrl(const QUrl& possibleRedirectUrl, 
           const QUrl& oldRedirectUrl) const { 
    QUrl redirectUrl; 
    /* 
    * Check if the URL is empty and 
    * that we aren't being fooled into a infinite redirect loop. 
    * We could also keep track of how many redirects we have been to 
    * and set a limit to it, but we'll leave that to you. 
    */ 
    if(!possibleRedirectUrl.isEmpty() && 
     possibleRedirectUrl != oldRedirectUrl) { 
     redirectUrl = possibleRedirectUrl; 
    } 
    return redirectUrl; 
} 
+0

Bir yolun bulunmadığını düşündüm ama bir yerde bir şey eksik olup olmadığından emin değildim, bu kadar temizleyeceğiniz için teşekkürler Kfunk :) – Kal

+1

resmi NASIL bozukluğunu bozuyor :( –

+0

@ DavidSánchez: Yorumu güncellendi Bunu yansıtmak için maalesef wiki içeriği silinmeden önce taşınmamış :( – kfunk

14

Bu biraz eski ama oto yönlendirme desteği sadece Qt 5.6 eklenir olduğunu. Bunu kontrol ediniz QNetworkRequest::FollowRedirectsAttribute (http://doc.qt.io/qt-5/qnetworkrequest.html).

+1

Eskiden ne demek istiyorsun, benim için yeni, bunu söylediğin için teşekkürler, a ** 'yı kurtardın, 5.5'ten 5.6'ya kadar güncelleme yapacağım Bunun çalışması için. –

İlgili konular