我一直在为StackApps API编写Delphi库。
我遇到了Indy的问题。我正在使用Delphi 2010附带的版本。 如果将无效参数传递给其中一个StackApps API,它将返回HTTP错误代码400,然后在响应中它将包含一个包含更多详细信息的JSON对象。
通过访问Chrome浏览器中的http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose,您可以看到示例。 I.E.和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详细信息的方法。
答案 0 :(得分:16)
从您对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;