2010-06-10 16 views
8

He estado escribiendo una biblioteca de Delphi para la API StackApps.Obteniendo respuesta de TIdHttp con el código de error 400

Me he encontrado con un problema con Indy. Estoy utilizando la versión que se envía con Delphi 2010. Si pasa parámetros no válidos a una de las API de StackApps, devolverá un código de error HTTP 400 y luego en la respuesta contendrá un objeto JSON con más detalles.

Al visitar http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose en el navegador Chrome, puede ver un ejemplo. ES DECIR. y Firefox oculta el JSON.

Uso de WireShark Puedo ver que el objeto JSON se devuelve usando el siguiente código, pero no puedo acceder a él usando Indy.

Para este código de prueba dejé caer un componente TIdHttp en el formulario y coloqué el siguiente código con un clic de botón.

procedure TForm10.Button2Click(Sender: TObject); 
var 
SS : TStringStream; 
begin 
    SS := TStringStream.Create; 
    IdHTTP1.Get('http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose',SS,[400]); 
    Memo1.Lines.Text := SS.DataString; 
    SS.Free; 
end; 

Pasé [400] para que no aumentara la excepción de 400. Es como si Indy dejara de leer la respuesta. Como el contenido de Memo1 está vacío.

Estoy buscando una manera de obtener los detalles de JSON.

Respuesta

14

Elimina el valor del parámetro AIgnoreReplies de tu llamada a Get(). Deje que eleve la excepción normalmente. El texto JSON que está buscando está en la propiedad EIdHTTPProtocolException.ErrorMessage. Por ejemplo:

procedure TForm10.Button2Click(Sender: TObject); 
begin 
    try 
    Memo1.Lines.Text := IdHTTP1.Get('http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose'); 
    except 
    on E: EIdHTTPProtocolException do begin 
     if E.ErrorCode = 400 then 
     Memo1.Lines.Text := E.ErrorMessage 
     else 
     raise; 
    end; 
    end; 
end; 
+0

Estoy parado corregido. –

+2

Y sí AIgnoreReplies es realmente bueno al ignorar las respuestas :-) –

+0

Necesitaba obtener la respuesta también, para que pueda agregar: Memo1.Lines.Add (IdHTTP1.ResponseText); –

Cuestiones relacionadas