2010-06-10 6 views
8

J'ai écrit une bibliothèque Delphi pour StackApps API.Obtenir la réponse de TIdHttp avec le code d'erreur 400

J'ai rencontré un problème avec Indy. J'utilise la version fournie avec Delphi 2010. Si vous transmettez des paramètres non valides à l'une des API StackApps, il renvoie un code d'erreur HTTP 400, puis dans la réponse, il contient un objet JSON avec plus de détails.

En visitant http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose dans le navigateur Chrome, vous pouvez voir un exemple. C'EST À DIRE. et Firefox cache le JSON. Utilisation de WireShark Je peux voir que l'objet JSON est renvoyé en utilisant le code ci-dessous, mais je suis incapable d'y accéder en utilisant Indy.

Pour ce code de test j'ai laissé tomber un composant TIdHttp sur le formulaire et placé le code suivant dans un clic de bouton.

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; 

J'ai passé [400] pour ne pas déclencher l'exception 400. C'est comme si Indy avait cessé de lire la réponse. Comme le contenu de Memo1 est vide.

Je cherche un moyen d'obtenir les détails JSON.

Répondre

14

Supprimez la valeur du paramètre AIgnoreReplies de votre appel à Get(). Laisser lever l'exception normalement. Le texte JSON que vous recherchez se trouve dans la propriété EIdHTTPProtocolException.ErrorMessage. Par exemple:

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

Je suis corrigé. –

+2

Et oui AIgnoreReplies est vraiment bon à ignorer les réponses :-) –

+0

Je devais aussi obtenir la réponse, donc vous pouvez ajouter: Memo1.Lines.Add (IdHTTP1.ResponseText); –

Questions connexes