2013-02-11 28 views
5

私はwebviewerを持っていて、これを実現するために私たちのwebappにしかアクセスできないようにしたいと思っています。私は自分のQt Appで探しているPHPヘッダを入れました。これは正常に動作しますが、1つの例外を除いて、301の永続的な移動ステータスコードがあります。現代のブラウザーは自動的にあなたをリダイレクトしますが、http要求の最後に "/"を置きます。QNetworkReplyと301リダイレクト

WebアプリケーションのURLを入力すると、ヘッダーを検出できるようにスラッシュが必要ですが、末尾にスラッシュが付いていなくてもそのヘッダーに移動します。ここで

は、ヘッダ取得するために私の現在の方法である:私は2つのネットワーク要求を送信する最初の301を打つの問題を解決するには

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; 
    } 

を、最初のものはURLが入力されヒットしている場合301をチェック301ステータスコードがあり、reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();メソッドを使用して提案されたURLを取得し、そのURLを返します。ステータスコードがない場合は、ユーザーが入力した前のURLを返し、ヘッダーをチェックする別のネットワーク要求を送信します。

私は、ステータスコードをチェックするために送り出す最初の要求:

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; 
     } 

    } 
} 

かいつまんで、私は我々のアプリのヘッダを確認するには)1)301 2を確認するには、2つのネットワーク要求を送信しています。

これは1回のリクエストで実行できますか?このリダイレクトを自動的に行う方法がありませんか?

よろしく

ネイサン

答えて

9

がどうやらそこではありません。上記のリンクから

http://developer.nokia.com/community/wiki/Handling_an_HTTP_redirect_with_QNetworkAccessManagerの公式HOWTOエントリ(デッドリンクは、残念ながら、)あります

抽出:

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

私はどこかで何かが見つからなかったかどうかはわかりませんでした。@kfunkをクリアしてくれてありがとう: – Kal

+1

公式HOWTOへのリンクが壊れています:( –

+0

@DavidSánchez:コメントを更新しました残念ながら、wikiの内容は削除前に移動されていませんでした:( – kfunk

14

は、これは少し古いが、自動リダイレクトのサポートだけではQt 5.6に追加されています。これをチェックしてくださいQNetworkRequest::FollowRedirectsAttributehttp://doc.qt.io/qt-5/qnetworkrequest.html)。

+1

あなたは何を意味するのですか?それは新鮮です。これに言及してくれてありがとう、私のa **を救った、5.5から5.6に更新しますこれが機能するには –