Qt使用QNetworkAccessManager进行HTTP身份验证

3
我正在使用一个需要有效用户名/密码的webservice。我使用QNetworkAccessManager从PyQt中访问该webservice,它会发出以下信号:
authenticationRequired (QNetworkReply*, QAuthenticator*)

当需要认证时,发出信号。当我为QAuthenticator填写用户和密码时,一切正常。然而,我不知道如何在用户无效时中断循环。

从authenticationRequired的文档中可以看到:

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

对于无效凭据,此信号会一遍又一遍地发出...查看响应中的错误代码显示为0。该循环应该如何被打破或处理,以便以错误终止?

4个回答

2

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


1

你可以尝试一下:

QNetworkReply::abort()

或者

QNetworkReply::close()

?


0

调用QNetworkReply::abort()将导致请求失败,并显示错误“操作已中止”,而不是原始的401错误。现在正确的做法似乎是不要在您的authenticationRequired()槽内调用QAuthenticator::setUser()QAuthenticator::setPassword()。这将使QAuthenticatorPrivate::phase保持为Done,从而使请求以正确的错误代码干净地终止。

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

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


0

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

例如,当用户单击“确定”时,可以调用QAuthenticator :: setUser和setPassword,而单击“取消”时则不调用任何内容。就这样:-)

对于连接到&QNetworkAccessManager :: authenticationRequired的插槽也是如此(在这种情况下,您无需调用QNetworkReply :: abort(),只需根本不调用任何QAuthenticator方法即可保留HTTP代码,而调用abort()会更改它)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接