如何在IdHttp连接出错时获取响应内容?

5
当使用TIdHttp时,代码如下:
Memo1.Text := IdHTTP1.post(url,data);

如果没有HTTP错误,我可以将响应内容写入memo1。但是当它返回HTTP坏请求时,Indy不会给我任何内容。我也在使用try..except,但它只能防止错误弹出窗口,并且仍然无法给我内容。
如何获取即使返回HTTP错误也能获得内容?

不,我的意思是当它返回 HTTP 错误请求 400 时,我可以在 Fiddler 中看到其响应内容,所以它肯定发送了内容,但我无法在 Delphi 中获取它。Delphi 只会报错。 - Someone
1
在这个评论中(https://dev59.com/t1zUa4cB1Zd3GeqP0zbD#oyYCoYgBc1ULPQZFeDAb),你说“即使Firefox收到HTTP 400 Bad Request错误,它仍然会显示内容。例如,Internet Explorer会告诉您发生了错误请求,并且不会显示XML内容响应,Indy也是如此,创建错误消息并丢弃内容。”我认为我的问题正是如此。 - Someone
1
TIdHTTP 不会丢弃内容,而是将其放置在引发的异常中。有关详细信息,请参阅我的答案。 - Remy Lebeau
2个回答

7

当发生HTTP错误时,TIdHTTP会引发一个EIdHTTPProtocolException异常。该异常包含其ErrorCode属性中的HTTP状态码、其Message属性中的HTTP状态文本以及其ErrorMessage属性中的响应数据。


谢谢回答。当我禁用HoNoProtocolErrorException错误消息时,响应数据给出了回应。 - Someone

3

尝试这段代码

Try
    Memo1.Text := IdHTTP1.post(url,data);
except on e: EIdHTTPProtocolException do
begin
    memo1.lines.add(idHTTP1.response.ResponseText);
    memo1.lines.add(e.ErrorMessage);
end;

e.ErrorMessage将提供有关错误请求的一些信息。


然后不要包括第二个memo1.lines.add行。 - HeartWare
ResponseText 不是“内容”。它只是状态文本。我需要内容。 - Someone
谢谢您的回答。这是我的错误。当我禁用hoNoProtocolErrorException时,ErrorMessage给了我响应内容。 - Someone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接