Pergunta

Eu estou trabalhando com um webservice que requer um nome de usuário / senha válidos. De PyQt, estou acessando o webservice usando QNetworkAccessManager que emite o

authenticationRequired (QNetworkReply*, QAuthenticator*)

sinal quando (obviamente), a autenticação é necessária. Quando eu preencher o usuário e psswd para QAuthenticator, tudo funciona bem. No entanto, eu não posso ver como quebrar o ciclo quando o usuário é não válido.

De docs para authenticationRequired:

"Se ele rejeita as credenciais, este sinal será emitido novamente."

Para credenciais inválidas este sinal é emitido novamente, e novamente, e de novo ... Olhando para o código de erro na resposta mostrou 0. Como esse ciclo deveria ser quebrado ou manipulado para que ele termina com um erro?

Foi útil?

Solução

Yeh, é estranho. O que eu fiz anteriormente é verificar se eu já autenticado com esses detalhes e se eu tiver em seguida, chamar QNetworkReply.abort()

Outras dicas

Que tal tentar:

QNetworkReply::abort()

ou

QNetworkReply::close()

?

Chamando QNetworkReply::abort() fará o pedido falhar com o erro 'Operação abortada' em vez do 401 erro original. A coisa certa a fazer agora parece ser para não chamar QAuthenticator::setUser() ou QAuthenticator::setPassword() dentro do seu slot de authenticationRequired(). Isso vai deixar o QAuthenticatorPrivate::phase como Done que fará com que o pedido para terminar de forma limpa com o código de erro correto.

A documentação Qt é bastante claro neste ponto.

Este não parece ser o comportamento no Qt 4.7, e foi introduzida em algum ponto no Qt 4.8.

Se você retornar de um slot conectado a & QNetworkAccessManager :: proxyAuthenticationRequired sem chamar qualquer método QAuthenticator, o pedido será cancelado com o verdadeiro código HTTP (por exemplo, 401 ou 407).

Por exemplo, você pode chamar QAuthenticator :: setuser e setPassword quando o clics usuário OK e chamada nada quando ele clics Cancelar. Isso é tudo: -)

Isto também é verdade para entalhes ligados a & QNetworkAccessManager :: authenticationRequired (onde você não tem que chamar QNetworkReply :: abort (), você pode simplesmente chamar nenhum método QAuthenticator em tudo, que preservam HTTP código também, enquanto chamando abort ( ) alterá-lo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top