如何为布尔值返回布尔值?

时间:2019-02-13 06:07:58

标签: 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();
}

为了证明概念,我希望使用以下网址:

  

this

它应该重定向到:

  

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

我认为这应该很容易,但是答案在逃避我。我尝试放入url,然后检查答复中是否有标明重定向的标头,但都没有出现。阅读文档...花了我一个循环,因为如果我应该在QNetworkReplyQNetworkRequestQNetworkAccessManager本身上设置属性以允许重定向,然后构造一个布尔值。

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

  

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

如果我真的愿意,我可以使用QWebEngineView进行加载,并且只在URL前后进行比较,但这似乎有些繁琐。我只是想以最简单的方式执行上面的功能。

谢谢。

1 个答案:

答案 0 :(得分:1)

我强烈建议您通过以下方式查看回复的 http状态代码

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

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

无论如何,如果您调用

  

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设置不同的策略。