Qt HTTP-Authentifizierung mit QNetworkAccessManager
-
11-09-2019 - |
Frage
Ich arbeite mit einem Webservice, die einen gültigen Benutzernamen / Passwort erfordert. Von PyQt, ich Zugriff auf den Webservice QNetworkAccessManager verwendet, die die
aussendetauthenticationRequired (QNetworkReply*, QAuthenticator*)
Signal, wenn (offensichtlich), Authentifizierung erforderlich ist. Wenn ich dazu einfach den Benutzer und psswd für QAuthenticator, funktioniert alles einwandfrei. Allerdings kann ich nicht sehen, wie die Schleife zu unterbrechen, wenn der Benutzer nicht gültig.
Von der Dokumentation für authenticationRequired:
„Wenn es um die Anmeldeinformationen ablehnt, wird dieses Signal wieder ausgegeben werden.“
Für ungültige Anmeldeinformationen dieses Signal wieder emittiert wird, und wieder, und wieder ... Mit Blick auf dem Fehlercode in der Antwort zeigte 0. Wie diese Schleife gebrochen werden sollte oder gehandhabt, so dass es mit einem Fehler beendet?
Lösung
Yeh, es ist seltsam. Was ich Check vorher getan, wenn ich bereits mit diesen Details authentifiziert haben und wenn ich dann QNetworkReply.abort()
nennen
Andere Tipps
Was zu versuchen:
QNetworkReply::abort()
oder
QNetworkReply::close()
Beim QNetworkReply::abort()
bewirkt, dass die Anforderung mit dem Fehler ‚Operation Aborted‘ zum Scheitern verurteilt statt der ursprünglichen 401-Fehler. Die richtige Sache zu tun scheint jetzt zu sein, nicht QAuthenticator::setUser()
oder QAuthenticator::setPassword()
in Ihrem authenticationRequired()
Schlitz zu nennen. Dies wird den QAuthenticatorPrivate::phase
als Done
verlassen, die die Anforderung mit dem richtigen Fehlercode zu beenden sauber führen werden.
Die Qt-Dokumentation ist ziemlich unklar, zu diesem Punkt.
Dies schien nicht das Verhalten in Qt 4.7, zu sein, und wurde an einem gewissen Punkt in Qt 4.8 eingeführt.
Wenn Sie von einem Schlitz zurückkehren verbunden & QNetworkAccessManager :: proxyAuthenticationRequired ohne jede QAuthenticator Methode aufrufen, wird die Anforderung mit echten HTTP-Code abgebrochen werden (zum Beispiel 401 oder 407).
Zum Beispiel können Sie QAuthenticator rufen :: setUser und setPassword, wenn der Benutzer clics OK und nichts an, wenn er Abbrechen CLICS. Das ist alles: -)
Dies gilt auch für die Schlitze mit & QNetworkAccessManager :: authenticationRequired (wo Sie müssen QNetworkReply nicht aufrufen :: abbrechen (), können Sie einfach überhaupt keine QAuthenticator Methode aufrufen, die zu HTTP-Code erhalten, während Aufruf abbrechen ( ändern) it).