Indy和REST - 我可以防止例外吗?

时间:2013-02-21 22:00:39

标签: delphi rest delphi-xe2 indy

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

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

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

1 个答案:

答案 0 :(得分:10)

很抱歉,您必须使用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()版本,否则将丢弃内容。