如何返回一个关于QUrl是否重定向的布尔值?

问题描述 投票:0回答:1

我一直在玩这个,我不能完全遵循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,并检查回复是否有标题指示重定向,但没有出现。阅读文档......我花了一个循环,因为我无法理解我是否应该在QNetworkReplyQNetworkRequestQNetworkAccessManager本身设置属性以允许重定向,然后构建一个布尔值。

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

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

如果我真的想,我可以使用QWebEngineView加载,只是比较网址之前和之后,但这似乎有点沉重。我只想要最简单的方法来执行上面的功能。

谢谢。

c++ qt http redirect qnetworkaccessmanager
1个回答
1
投票

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

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

在你的例子中恰好是200(OK),即根本没有重定向。

无论如何,如果你调用

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

(注意协议名称中缺少的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设置。

© www.soinside.com 2019 - 2024. All rights reserved.