Получение ответа от TIdHttp с кодом ошибки 400

Я писал библиотеку 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.

9
задан Community 13 April 2017 в 12:25
поделиться

1 ответ

Удалите значение параметра 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; 
16
ответ дан 4 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: