HTTP-аутентификация Qt с помощью QNetworkAccessManager - PullRequest
3 голосов
/ 06 августа 2009

Я работаю с веб-сервисом, который требует правильное имя пользователя / пароль. Из PyQt я получаю доступ к веб-сервису, используя QNetworkAccessManager, который выдает

authenticationRequired (QNetworkReply*, QAuthenticator*)

сигнал, когда (очевидно) требуется аутентификация. Когда я заполняю пользователя и psswd для QAuthenticator, все отлично работает. Однако я не вижу, как разорвать цикл, когда пользователь не действителен.

Из документов для аутентификации Требуется:

«Если он отклоняет учетные данные, этот сигнал будет издан снова.»

Для недействительных учетных данных этот сигнал испускается снова и снова, и еще раз ... Просмотр кода ошибки в ответе показал 0. Как этот цикл должен быть разорван или обработан так, чтобы он завершился с ошибкой?

Ответы [ 4 ]

2 голосов
/ 06 августа 2009

Да, это странно. То, что я сделал ранее, это проверил, прошел ли я проверку подлинности с этими данными, а затем позвонил QNetworkReply.abort()

1 голос
/ 06 августа 2009

Как насчет попытки:

QNetworkReply::abort()

или

QNetworkReply::close()

0 голосов
/ 05 сентября 2015

Если вы вернетесь из слота, подключенного к & QNetworkAccessManager :: proxyAuthenticationRequired без вызова какого-либо метода QAuthenticator, запрос будет прерван с реальным HTTP-кодом (например, 401 или 407).

Например, вы можете вызвать QAuthenticator :: setUser и setPassword, когда пользователь нажимает кнопку ОК, и ничего не вызывать, когда он нажимает кнопку Отмена. Вот и все: -)

Это также верно для слотов, подключенных к & QNetworkAccessManager :: authenticationRequired (где вам не нужно вызывать QNetworkReply :: abort (), вы можете просто вообще не вызывать метод QAuthenticator, который тоже сохраняет код HTTP, тогда как вызов abort ) переделай).

0 голосов
/ 11 декабря 2014

Вызов QNetworkReply::abort() приведет к сбою запроса с ошибкой «Операция прервана» вместо исходной ошибки 401. Похоже, что теперь правильно не звонить QAuthenticator::setUser() или QAuthenticator::setPassword() внутри вашего слота authenticationRequired(). Это оставит QAuthenticatorPrivate::phase как Done, что приведет к чистому завершению запроса с правильным кодом ошибки.

Документация Qt довольно неясна в этом вопросе.

Похоже, это не было поведением в Qt 4.7, и было введено в некоторый момент в Qt 4.8.

...