【问题标题】:Qt HTTP authentication with QNetworkAccessManager使用 QNetworkAccessManager 进行 Qt HTTP 身份验证
【发布时间】:2010-11-17 09:38:40
【问题描述】:

我正在使用需要有效用户名/密码的网络服务。从 PyQt,我使用 QNetworkAccessManager 访问 web 服务,它发出

authenticationRequired (QNetworkReply*, QAuthenticator*)

在(显然)需要身份验证时发出信号。当我填写用户和 psswd 时 QAuthenticator,一切正常。但是,当用户 not 有效时,我看不到如何中断循环。

来自需要身份验证的文档:

“如果它拒绝凭据,将再次发出此信号。”

对于无效的凭据,此信号会一次又一次地发出,并且 再次...查看回复中的错误代码显示为 0。应该如何破坏或处理此循环以使其因错误而终止?

【问题讨论】:

    标签: python qt networking qt4 pyqt


    【解决方案1】:

    是的,这很奇怪。我之前所做的是检查我是否已经使用这些详细信息进行了身份验证,然后我是否调用了QNetworkReply.abort()

    【讨论】:

      【解决方案2】:

      试试怎么样:

      QNetworkReply::abort()
      

      QNetworkReply::close()
      

      ?

      【讨论】:

        【解决方案3】:

        调用QNetworkReply::abort() 将导致请求失败,并出现“操作中止”错误,而不是原来的 401 错误。现在正确的做法似乎是不要在 authenticationRequired() 插槽内调用 QAuthenticator::setUser()QAuthenticator::setPassword()。这会将QAuthenticatorPrivate::phase 保留为Done,这将导致请求以正确的错误代码完全终止。

        Qt 文档在这一点上相当不清楚。

        这似乎不是 Qt 4.7 中的行为,而是在 Qt 4.8 中的某个时候引入的。

        【讨论】:

          【解决方案4】:

          如果您从连接到 &QNetworkAccessManager::proxyAuthenticationRequired 的插槽返回而没有调用任何 QAuthenticator 方法,则请求将被真实的 HTTP 代码(例如 401 或 407)中止。

          例如,您可以在用户单击 OK 时调用 QAuthenticator::setUser 和 setPassword,而在用户单击 Cancel 时不调用任何内容。就是这样:-)

          对于连接到 &QNetworkAccessManager::authenticationRequired 的插槽也是如此(您不必调用 QNetworkReply::abort(),您可以根本不调用 QAuthenticator 方法,它也保留 HTTP 代码,而调用 abort( ) 改变它)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-02
            相关资源
            最近更新 更多