Получение ответа от TIdHttp с кодом ошибки 400 - PullRequest
9 голосов
/ 11 июня 2010

Я пишу библиотеку Delphi для StackApps API.

Я столкнулся с проблемой с Инди. Я использую версию, которая поставляется с Delphi 2010. Если вы передадите недопустимые параметры в один из API-интерфейсов StackApps, он вернет код ошибки HTTP 400, а затем в ответе будет содержать объект JSON с более подробной информацией.

Посетив http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose в браузере Chrome, вы можете увидеть пример. И.Е. и Firefox скрывают JSON.

Используя WireShark, я вижу, что объект JSON возвращается с использованием приведенного ниже кода, но я не могу получить к нему доступ с помощью Indy.

Для этого тестового кода я уронил компонент 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.

1 Ответ

16 голосов
/ 11 июня 2010

Удалите значение параметра 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; 
...