2009-03-03 18 views
5

Tengo un problema al usar Indy HTTP (en Delphi) con la API de Contactos de Google.Indy HTTP: leyendo el contenido de la respuesta en un 403

Por favor refiérase a la sección "Respuesta ClientLogin" en la siguiente página:

http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html

El servidor devuelve un 403 cuando la autenticación es incorrecto o se produce un error ... como se esperaba. Sin embargo, de acuerdo con este documento, hay información en el contenido de respuesta que el cliente necesita, p. el motivo del error, y el URL de captcha, etc.

El problema es que el componente Indy IdHTTP arroja una excepción en un 403 y el contenido de la respuesta está vacío. Hasta ahora no he encontrado manera de llegar a este contenido. He intentado ajustar la llamada a Publicar en una prueba ... excepto luego de leer la secuencia de respuesta, pero siempre está vacía en un 403.

¿Cómo podría hacer esto?

Respuesta

7

He encontrado una solución. Parece que el contenido está almacenado en el campo ErrorMessage de EIdHTTPProtocolException.

try 
    http.Post('https://www.google.com/accounts/ClientLogin', slReq); 
except 
    on E: EIdHTTPProtocolException do 
     Memo1.Lines.Add(E.ErrorMessage); 
end; 

parece hacer el truco.

(Por cierto, estoy usando Indy 9. Estoy seguro de que la Indy 10 es similar.)

+0

¡Genial! Me salvó a mí y a StackOverflow otra pregunta más :-) – Vegar

2

Tienes razón. Parece que en TIdHTTPProtocol.ProcessResponse se lee la respuesta pero luego se descarta. (Y ni siquiera le asigna nil)

Pero debe ser fácil de adaptar la función CheckException para escribir la respuesta en IdHTTP.Response.ContentStream

Tal vez usted podría presentar un informe de error o de una solicitud de función.

+0

Gracias por su respuesta. Me ayudó a encontrar la respuesta. – kes

+0

Traté de votar pero aparentemente no tengo suficiente reputación para hacerlo. – kes

+0

No hay necesidad de alterar el código de Indy. Si está usando una versión actualizada, puede habilitar los indicadores 'hoNoProtocolErrorException' y' hoWantProtocolErrorContent' en la propiedad 'TIdHTTP.HTTPOptions'. –

Cuestiones relacionadas