5

有没有办法防止 Indy 在任何/所有 HTTP 状态上引发异常?

我对 IgnoreReplies 数组的理解是它会阻止这些状态再次出现,但这不是我想要的。我希望所有状态都回来,并且没有一个会引发异常。例如,有很多 REST 服务返回 404,这被认为是完全“有效”的响应。

我真的不希望异常处理程序中有 1/2 的代码,那么有没有办法让当前的 Indy 只返回所有内容?

4

1 回答 1

11

抱歉,但您必须使用IgnoreReplies参数来告诉TIdHTTP哪些特定的 HTTP 回复代码不会引发异常。目前没有办法告诉TIdHTTP一般情况下不对所有可能的回复提出例外。如果你想收到一个不成功的回复,比如 404,而不引发异常,那么你必须告诉TIdHTTP它,例如:

IdHTTP.Get('http://host/path', [404]);

请注意,此语法仅适用于GET请求,而不适用于其他请求,例如POST(除非您TIdHTTP.DoRequest()直接调用受保护的方法)。

Indy 是专门围绕异常处理设计的。如果你想有效地使用 Indy,你必须接受异常,而不是避免它们。TIdHTTP.Get()包装或TIdHTTP.Post()小块有什么麻烦try/except?如果您不想处理所有可能的异常,那么您可以自己拥有except块句柄EIdHTTPProtocolException

try
  IdHTTP.Get('http://host/path');
except
  on E: EIdHTTPProtocolException do
  begin
    if E.ErrorCode <> 404 then Raise;
  end;
end;

更新:多考虑一下,可能值得为TIdHTTP.HTTPOptions属性添加一个新标志以禁用所有状态代码的异常。我正在考虑。

更新hoNoProtocolErrorException:现在已向该TIdHTTP.HTTPOptions属性添加了一个新标志:

IdHTTP.HTTPOptions := IdHTTP.HTTPOptions + [hoNoProtocolErrorException];
IdHTTP.Get('http://host/path');
// use IdHTTP.ResponseCode as needed...

更新:此外,还有一个hoWantProtocolErrorContent标志。当hoNoProtocolErrorException启用并发生 HTTP 错误时,如果hoWantProtocolErrorContent启用则错误内容将返回给调用者(在String返回值或AResponseContent输出流中,取决于正在调用的Get()/的版本),否则内容将是Post()丢弃。

于 2013-02-21T22:42:34.580 回答