使用QNetworkAccessManager进行Qt HTTP身份验证
我正在使用一个需要有效用户名和密码的网络服务。从PyQt中,我通过QNetworkAccessManager访问这个网络服务,当需要认证时,它会发出一个信号。
authenticationRequired (QNetworkReply*, QAuthenticator*)
当我为QAuthenticator填写用户名和密码时,一切都正常。但是,我不知道当用户的凭证无效时,如何打破这个循环。
在关于authenticationRequired的文档中写着:
“如果拒绝了凭证,这个信号会再次被发出。”
对于无效的凭证,这个信号会一次又一次地被发出……查看回复中的错误代码显示为0。那这个循环应该如何打破或处理,以便能以错误结束呢?
4 个回答
0
调用 QNetworkReply::abort()
会导致请求失败,显示的错误信息是“操作被中止”,而不是最初的401错误。现在正确的做法似乎是在你的 authenticationRequired()
槽函数中,不要调用 QAuthenticator::setUser()
或 QAuthenticator::setPassword()
。这样做会让 QAuthenticatorPrivate::phase
保持为 Done
,这会使请求正常结束,并返回正确的错误代码。
Qt的文档在这一点上并不是很清楚。
在Qt 4.7中似乎不是这样的行为,而是在Qt 4.8的某个时候引入的。
1
你可以试试这个:
QNetworkReply::abort()
或者
QNetworkReply::close()
?
2
是的,这确实有点奇怪。我之前做的就是检查一下我是否已经用那些信息进行了认证,如果已经认证过了,就调用 QNetworkReply.abort()
。