c++ - 如何返回一个 QUrl 是否重定向的 bool 值?

标签 c++ qt http redirect qnetworkaccessmanager

我一直在玩这个,但我不能完全遵循 qt 中重定向的逻辑。真的,我想做的就是构建一个像这样的函数:

bool MyClass::isRedirect(const QUrl &url)
{
        return QUrl(m_NetworkAccessManager.get(QNetworkRequest(url))
        ->header(QNetworkRequest::LocationHeader).toString()).toString()
        != url.toString();
}

对于概念验证,我希望使用此 url 完成:

https://en.wikipedia.org/wiki/Vario-Tessar

它应该重定向到:

https://en.wikipedia.org/wiki/Tessar#Vario-Tessar

我想这应该很容易,但答案却在逃避我。我尝试输入 url,并检查指示重定向的 header 的回复,但没有出现。阅读文档...我陷入了一个循环,因为我不太明白是否应该在 QNetworkReplyQNetworkRequestQNetworkAccessManager 本身允许重定向,然后构造一个 bool 值。

我也不确定每个重定向是否相同,或者是否某些页面以不同方式实现它,在页面加载后运行脚本,如下所示:

https://en.wikipedia.org/w/index.php?title=Vario%20Tessar&action=edit

如果我真的想要,我可以使用 QWebEngineView 来加载,然后比较 url 前后,但这似乎有点重。我只想要执行上述功能的最简单方法。

谢谢。

最佳答案

我强烈建议以这种方式查看回复的http状态码:

int http_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

在您的示例中,它恰好是 200(好的),即根本没有重定向。

无论如何,如果你调用

http://en.wikipedia.org/wiki/Vario-Tessar

(注意协议(protocol)名称中缺少的 s)将发生重定向。

鉴于管理器和/或请求正在使用默认重定向策略 (QNetworkRequest::ManualRedirectPolicy),响应将显示状态代码 301,这时间,没有数据。此外,您可以检查重定向目标:

int code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
static QVector<int> redirectCodes{301, 302, 303, 305, 307, 308};
if(redirectCodes.contains(code))
{
    QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
    //...

此时,您可以使用重定向目标启动新请求,或者完全中止事务,或者您自己的个人重定向策略建议的任何内容。

如果您根本不想处理重定向,您可以使用 QNetworkAccessManager::setRedirectPolicy 在管理器级别设置不同的策略。 ,或在请求级别,使用 QNetworkRequest::setAttribute .

关于c++ - 如何返回一个 QUrl 是否重定向的 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54663613/

相关文章:

php - 获取在 PHP 中重定向的远程图像

c++ - 如何从 Linux 上的动态库加载静态函数(在 C 中)

c++ - 使用 QGraphicsEffect 删除 QGraphicsItem 会导致段错误

QtCore 对 QCoreApplication 的依赖

c++ - 使用 C++ 实现存储任何类型的哈希

http - 通过一个 http.ResponseWriter 发送少量响应

google-chrome - Chrome - 确认表单重新提交 - 不同的行为

c++ - 与 move 构造函数混淆 : unable to call move constructor

c++ - Ubuntu C++ UDP 包没有到达

c++ - OpenCV (C++) 中 PNG 文件的 GrabCut 读取掩码