Indy HTTP: чтение содержимого ответа на 403 - PullRequest
6 голосов
/ 03 марта 2009

У меня проблема с использованием Indy HTTP (в Delphi) с API контактов Google.

См. Раздел «Ответ ClientLogin» на следующей странице:

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

Сервер возвращает 403, когда аутентификация неверна или происходит ошибка ... как и ожидалось. Однако согласно этому документу в контенте ответа есть информация, которая необходима клиенту, например, причину ошибки, а также URL-адрес и т. д.

Проблема в том, что компонент Indy IdHTTP выдает исключение на 403, а содержимое ответа пустое. Я пока не нашел способа добраться до этого контента. Я попытался обернуть вызов Post в попытку ... за исключением чтения потока ответов, но он всегда пуст на 403.

Как бы я поступил так?

Ответы [ 2 ]

8 голосов
/ 03 марта 2009

Я нашел решение. Похоже, что содержимое хранится в поле ErrorMessage EIdHTTPProtocolException.

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

кажется, добивается цели.

(Кстати, я использую Indy 9. Я уверен, что Indy 10 похож.)

3 голосов
/ 03 марта 2009

Вы правы. Кажется, в TIdHTTPProtocol.ProcessResponse ответ читается, но после этого отбрасывается. (И даже не установлен на ноль)

Но должно быть легко адаптировать функцию CheckException для записи ответа в IdHTTP.Response.ContentStream

Возможно, вы могли бы подать отчет об ошибке или запрос функции.

...