Я писал библиотеку Delphi для StackApps API.
Я столкнулся с проблемой с Инди. Я использую версию, которая поставляет с Delphi 2010. При передаче недопустимых параметров одному из StackApps API, он возвратит Код Ошибки HTTP 400, и затем в ответе он будет содержать объект JSON с большим количеством деталей.
Путем посещения http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose в браузере Chrome Вы видите Пример. Т.Е. и Firefox скрывает JSON.
Используя WireShark I видят, что объект JSON возвращается с помощью кода ниже, но я не могу получить доступ к нему с помощью Инди.
Для этого тестового кода я отбросил компонент TIdHttp на форме и поместил следующий код в нажатие кнопки.
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;
Я передал [400] так, чтобы это не повышало 400 исключений. Это - как будто Инди прекратила читать ответ. Поскольку содержание Memo1 пусто.
Я ищу способ получить Детали JSON.
Удалите значение параметра AIgnoreReplies из вашего вызова Get (). Пусть он вызывает исключение в обычном режиме. Текст JSON, который вы ищете, находится в свойстве EIdHTTPProtocolException.ErrorMessage. Например:
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;