我有一个WebViewer,只想让它能够访问我们的Web应用程序。为了实现这一点,我已经放置了一个PHP头文件,并在我的Qt App中查找它。这个方法很好用,但有一个例外,就是301永久移动状态代码。现代浏览器会自动重定向,但在HTTP请求末尾加上“/”。
为了解决301跳转问题,我发送了两个网络请求。第一个请求访问输入的URL并检查状态码是否为301。如果状态码为301,则使用
第一个请求是我发送的,用于检查状态码:
长话短说,我正在发送两个网络请求,1)检查301 2)检查我们的应用程序头文件。
有没有办法在一个请求中完成这个操作?我是否错过了一个可以自动重定向的方法?
问候,
Nathan
当输入我们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跳转问题,我发送了两个网络请求。第一个请求访问输入的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)检查我们的应用程序头文件。
有没有办法在一个请求中完成这个操作?我是否错过了一个可以自动重定向的方法?
问候,
Nathan
QNetworkRequest::FollowRedirectsAttribute
已被弃用,建议使用QNetworkRequest::RedirectPolicyAttribute
(请查看可能的值)。 - cbuchart