有没有办法防止 Indy 在任何/所有 HTTP 状态上引发异常?
我对 IgnoreReplies 数组的理解是它会阻止这些状态再次出现,但这不是我想要的。我希望所有状态都回来,并且没有一个会引发异常。例如,有很多 REST 服务返回 404,这被认为是完全“有效”的响应。
我真的不希望异常处理程序中有 1/2 的代码,那么有没有办法让当前的 Indy 只返回所有内容?
有没有办法防止 Indy 在任何/所有 HTTP 状态上引发异常?
我对 IgnoreReplies 数组的理解是它会阻止这些状态再次出现,但这不是我想要的。我希望所有状态都回来,并且没有一个会引发异常。例如,有很多 REST 服务返回 404,这被认为是完全“有效”的响应。
我真的不希望异常处理程序中有 1/2 的代码,那么有没有办法让当前的 Indy 只返回所有内容?
抱歉,但您必须使用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()
丢弃。