2009-03-03 8 views
5

Ich habe ein Problem mit Indy HTTP (in Delphi) mit der Google Kontakte API.Indy HTTP: Antwort Inhalt auf einem 403 lesen

entnehmen Sie bitte dem Abschnitt „Clientlogin Response“ auf der folgenden Seite:

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

Der Server hat eine 403 zurückgibt, wenn die Authentifizierung nicht korrekt ist oder ein Fehler auftritt ... wie erwartet. Gemäß diesem Dokument gibt es jedoch Informationen in dem Antwortinhalt, die von dem Client benötigt werden, z. Der Fehlergrund und die Captcha-URL usw.

Das Problem ist, dass die Indy-IdHTTP-Komponente eine Ausnahme auf einem 403 auslöst und der Inhalt der Antwort leer ist. Ich habe bisher keinen Weg gefunden, zu diesem Inhalt zu kommen. Ich habe versucht, den Anruf zu Post in einem Versuch zu wickeln ... außer dann den Antwort-Stream lesen, aber es immer leer auf einem 403.

Wie würde ich darüber gehen, dies zu tun?

Antwort

7

Ich habe eine Lösung gefunden. Offenbar ist der Inhalt im Feld ErrorMessage von EIdHTTPProtocolException gespeichert.

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

scheint den Trick zu tun.

(Übrigens, ich benutze Indy 9. Ich bin mir sicher Indy 10 ist ähnlich.)

+0

Großartig! Gespeichert haben mich und StackOverflow noch eine weitere Frage :-) – Vegar

2

Sie haben Recht. Es scheint in TIdHTTPProtocol.ProcessResponse die Antwort wird gelesen, aber danach verworfen. (Und nicht einmal auf Null gesetzt) ​​

Aber es sollte die CheckException Funktion anzupassen leicht die Antwort in IdHTTP.Response.ContentStream

Vielleicht schreiben könnten Sie einen Fehlerbericht oder ein Feature-Request-Datei.

+0

Vielen Dank für Ihre Antwort. Es hat mir geholfen, die Antwort zu finden. – kes

+0

Ich habe versucht zu verbessern, aber anscheinend habe ich nicht genug Ruf, um das zu tun. – kes

+0

Es besteht keine Notwendigkeit, Indys Code zu ändern. Wenn Sie eine aktuelle Version verwenden, können Sie die Flags 'hoNoProtocolErrorException' und' hoWantProtocolErrorContent' in der Eigenschaft 'TIdHTTP.HTTPOptions' aktivieren. –