使用QNetworkAccessManager进行Qt HTTP身份验证

3 投票
4 回答
3234 浏览
提问于 2025-04-15 13:25

我正在使用一个需要有效用户名和密码的网络服务。从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()

撰写回答