从 TIdHttp 获取响应,错误代码为 400
我一直在为 StackApps API 编写 Delphi 库。
我在印地遇到了问题。我使用的是 Delphi 2010 附带的版本。 如果您将无效参数传递给 StackApps API 之一,它将返回 HTTP 错误代码 400,然后在响应中它将包含一个包含更多详细信息的 JSON 对象。
通过访问 http://api.stackoverflow.com/0.8/stats/?Key= BadOnPurpose 在 Chrome 浏览器中您可以看到一个示例。 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 详细信息的方法。
I have been writing a Delphi library for StackApps API.
I have run into a problem with Indy. I am using the version that ships with Delphi 2010.
If you pass invalid parameters to one of the StackApps API it will return a HTTP Error Code 400 and then in the response it will contain a JSON object with more details.
By visiting http://api.stackoverflow.com/0.8/stats/?Key=BadOnPurpose in Chrome Browser you can see an Example. I.E. and Firefox hide the JSON.
Using WireShark I can see that the JSON object is returned using the code below, but I am unable to access it using Indy.
For this test code I dropped a TIdHttp component on the form and placed the following code in a button click.
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;
I passed [400] so that it would not raise the 400 exception. It is as if Indy stopped reading the response. As the contents of Memo1 are empty.
I am looking for a way to get the JSON Details.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
从对 Get() 的调用中删除 AIgnoreReplies 参数值。让它正常引发异常。您要查找的 JSON 文本位于 EIdHTTPProtocolException.ErrorMessage 属性中。例如:
Remove the AIgnoreReplies parameter value from your call to Get(). Let it raise the exception normally. The JSON text you are looking for is in the EIdHTTPProtocolException.ErrorMessage property. For example: