【问题标题】:How to return a boolean for whether or not a QUrl redirects?如何为 QUrl 重定向是否返回布尔值?
【发布时间】:2019-07-06 21:33:54
【问题描述】:

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

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

为了概念验证,我想用这个网址完成:

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

它应该重定向到:

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

我认为这应该很容易,但答案是在逃避我。我尝试输入网址,并检查指示重定向的标题的回复,但没有出现。阅读文档...我花了一个循环,因为我无法完全掌握是否应该在 QNetworkReplyQNetworkRequestQNetworkAccessManager 本身上设置一个属性以允许重定向,然后,构造一个布尔值。

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

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

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

谢谢。

【问题讨论】:

    标签: c++ qt http redirect qnetworkaccessmanager


    【解决方案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 设置不同的策略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      相关资源
      最近更新 更多