Domanda

Sto lavorando con un servizio web che richiede un nome utente/password validi.Da PyQt, accedo al servizio web utilizzando QNetworkAccessManager che emette il file

authenticationRequired (QNetworkReply*, QAuthenticator*)

segnale quando (ovviamente) è richiesta l'autenticazione.Quando riempirò l'utente e PSSWD per Qauthenticator, tutto funziona bene.Tuttavia, non riesco a vedere come interrompere il ciclo quando l'utente lo è non valido.

Dai documenti per l'autenticazioneRichiesto:

"Se rifiuta le credenziali, questo segnale verrà emesso nuovamente."

Per le credenziali non valide, questo segnale viene emesso di nuovo, e ancora, e ancora ...Guardando il codice di errore nella risposta ho mostrato 0.Come dovrebbe essere interrotto o gestito questo ciclo in modo che termini con un errore?

È stato utile?

Soluzione

Sì, è strano.Quello che ho fatto in precedenza è controllare se mi sono già autenticato con quei dettagli e se l'ho fatto, quindi chiamare QNetworkReply.abort()

Altri suggerimenti

Che dire di provare:

QNetworkReply::abort()

o

QNetworkReply::close()

QNetworkReply::abort() Calling farà sì che la richiesta di fallire con l'errore 'Operazione interrotta' invece l'errore originale 401. La cosa giusta da fare ora sembra essere di non chiamare QAuthenticator::setUser() o QAuthenticator::setPassword() all'interno slot authenticationRequired(). Questo lascerà la QAuthenticatorPrivate::phase come Done che farà sì che la richiesta per terminare in modo pulito con il codice di errore corretto.

La documentazione Qt è piuttosto chiaro su questo punto.

Questo non sembra essere il comportamento in Qt 4.7, ed è stato introdotto ad un certo punto in Qt 4.8.

Se si torna da una fessura collegata a & QNetworkAccessManager :: proxyAuthenticationRequired senza chiamare qualsiasi metodo QAuthenticator, la richiesta verrà interrotta con il codice vero e proprio HTTP (ad esempio 401 o 407).

Per esempio è possibile chiamare QAuthenticator :: setuser e setPassword quando i clics utente OK e chiamare nulla quando clics Cancel. Questo è tutto: -)

Questo è vero anche per gli slot collegato al & QNetworkAccessManager :: authenticationRequired (dove non c'è bisogno di chiamare QNetworkReply :: abort (), si può semplicemente chiamare nessun metodo QAuthenticator a tutti, che conserva il codice HTTP troppo, mentre chiamando abortire ( ) modificarlo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top