2009-03-03 5 views
5

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

Пожалуйста, обратитесь к разделу «ClientLogin ответ» на следующей странице:

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

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

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

Как бы я это сделал?

ответ

7

Я нашел решение. Похоже, что содержимое хранится в поле 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 похож.)

+0

Отлично! Сэкономил и мне, и StackOverflow еще один вопрос :-) – Vegar

2

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

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

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

+0

Спасибо за ваш ответ. Это помогло мне найти ответ. – kes

+0

Я попытался подняться, но, видимо, у меня недостаточно репутации, чтобы сделать это. – kes

+0

Нет необходимости изменять код Indy. Если yoy использует обновленную версию, вы можете включить флаги 'hoNoProtocolErrorException' и' hoWantProtocolErrorContent' в свойстве 'TIdHTTP.HTTPOptions'. –

Смежные вопросы