5

Indyが一部またはすべてのHTTPステータスで例外を発生させないようにする方法はありますか?

IgnoreReplies配列についての私の理解は、それらのステータスが二度と戻らないようにするということですが、それは私が望んでいることではありません。すべてのステータスが戻ってくるようにしたいのですが、いずれも例外を発生させません。たとえば、404を返すRESTサービスはたくさんあり、それは完全に「有効な」応答と見なされます。

コードの1/2を例外ハンドラーに入れたくないので、現在のIndyにすべてを返すようにする方法はありますか?

4

1 に答える 1

11

申し訳ありませんが、IgnoreRepliesパラメータを使用しTIdHTTPて、例外を発生させない特定のHTTP応答コードを指定する必要があります。現在、TIdHTTP一般的に考えられるすべての応答に対して例外を発生させないように指示する方法はありません。例外を発生させずに404などの失敗した応答を受信したい場合は、次のように伝える必要がありますTIdHTTP

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

この構文は、 (保護されたメソッドを直接呼び出さない限りGET)のような他のリクエストではなく、リクエストでのみ使用できることに注意してください。POSTTIdHTTP.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戻り値または出力ストリームのいずれかで)。それ以外の場合、内容は次のようになります。破棄されました。AResponseContentGet()Post()

于 2013-02-21T22:42:34.580 に答える