gpt4 book ai didi

c++ - QNetworkReply 和 301 重定向

转载 作者:可可西里 更新时间:2023-11-01 18:03:04 24 4
gpt4 key购买 nike

我有一个网络查看器,只希望它只能访问我们的网络应用程序,为了实现这一点,我在我的 Qt 应用程序中放置了一个 php header 。这工作正常,但有一个异常(exception),那就是 301 永久移动状态代码。现代浏览器会自动重定向您,但会在 http 请求的末尾放置一个“/”。

当输入我们的网络应用程序的 URL 时,它目前需要尾部斜线才能检测到标题,但我希望它也能到达该标题,即使他们没有放置尾部斜线。

这是我当前检索 header 的方法:

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- 获得建议的 url->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); 方法并返回该 URL 否则,如果没有状态代码,则它只返回用户输入的先前 URL,然后发送另一个网络请求以检查 header 。

我发出的第一个检查状态码的请求:

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) 检查我们的应用 header 。

有没有办法在一个请求中做到这一点?我是否缺少一种自动执行此重定向的方法?

问候

内森

最佳答案

If you are using Qt 6 then skip reading this answer as auto redirection is a default behaviour

如果您不使用 Qt 6,则为旧答案:

Auto redirection support was added to Qt 5.6 (QNetworkRequest::FollowRedirectsAttribute) .

默认情况下不启用:

QNetworkRequest req(QUrl("https://example.com/"));
req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);

关于c++ - QNetworkReply 和 301 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14809310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com