私は 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回のリクエストでこれを行う方法はありますか?このリダイレクトを自動的に行う方法がありませんか?
よろしく
ネイサン