我一直在为
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;
解决方法
从调用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;