12

私は webviewer を持っていて、webapps にのみアクセスできるようにしたいだけです。これを実現するために、Qt アプリで探している php ヘッダーを配置しました。これは問題なく動作しますが、例外が 1 つあります。それは 301 永久移動ステータス コードです。最近のブラウザは自動的にリダイレクトしますが、http リクエストの最後に「/」を付けます。

Web アプリへの URL が入力されると、現在、ヘッダーを検出できるようにするために末尾のスラッシュが必要ですが、末尾のスラッシュを付けなくても、そのヘッダーも取得したいと考えています。

ヘッダーを取得する現在の方法は次のとおりです。

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

最初に 301 にヒットする問題を解決するために、2 つのネットワーク要求を送信します。最初の 1 つは、入力された URL にヒットし、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;
        }

    }
}

簡単に言えば、2 つのネットワーク リクエストを送信しています。1) 301 を確認するため、2) アプリのヘッダーを確認するためです。

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

よろしく

ネイサン

4

2 に答える 2