10

我一直在为StackApps API 编写一个 Delphi 库。

我遇到了 Indy 的问题。我使用的是 Delphi 2010 附带的版本。如果您将无效参数传递给 StackApps API 之一,它将返回 HTTP 错误代码 400,然后在响应中它将包含一个带有更多详细信息的 JSON 对象。

通过在 Chrome 浏览器中访问http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose,您可以看到一个示例。IE 和 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 异常。就好像 Indy 停止阅读响应一样。因为 Memo1 的内容是空的。

我正在寻找一种获取 JSON 详细信息的方法。

4

1 回答 1

19

从对 Get() 的调用中删除 AIgnoreReplies 参数值。让它正常引发异常。您要查找的 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; 
于 2010-06-10T22:55:41.590 回答