部分的に成功したリクエストのHTTPステータスコード


115

ユーザーにメッセージを送信するアプリケーションがあります。ポストリクエストでは、その特定のメッセージを受信する必要があるすべてのユーザーで構成されるXML文字列が転送されます。リスト内のいずれかのユーザーが存在しない場合は、欠落しているユーザーのリストをクライアントに返して、さらに評価します。

ここで、リクエストが受け入れられたが、実行できないことがあったことを示す、アプリケーションの適切なステータスコードを教えてください。

リストに行方不明のユーザーを含めることが許可されていない場合、問題は回避されます。その後、送信しようとすると、4xxエラーが発生します。しかし、このようにAPIを作成しても意味がありません。一方、エラー条件は純粋にアプリケーション固有であると考えることができます。しかし、200を送信するだけでは正しくありません。また、エラーレスポンスを詳しく調べるときに、クライアントにヒントを与えるとよいでしょう。たとえば、そのユーザーに何度もメッセージを送信しないようにする

回答:


66

私は非常によく似た問題に対処しました。この場合、私は

207マルチステータス

これは厳密なHTTPではなく、WebDAV拡張機能の一部であるため、クライアントも制御できない場合、これは適切ではありません。もしそうなら、あなたはそのようなことをすることができます:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

ただし、これもHTTP拡張であり、クライアントも制御する必要があります。


3
これを使うことを考えましたが、あまり慣れていませんでした。ありがとう!
Norbert Hartl

これの良い点は、適切なデータを必要なだけ返すことができることです。これは、混合データセット、つまり一部が失敗し、一部が成功する場合に特に便利です。
カイラー

わかります。余分なレベルのステータス処理を回避しようとしているだけです(これは良いIMHOではありません)。私のコードのほとんどはHTTPのもので動作します。そして、私は私の説明したユースケースがなくてもうまくいくと思います。
Norbert Hartl

いつでも本文を送り返すことができます。JSON応答を含めて200を送信するか、どの応答が成功したかを判断するために必要なものを送信します。
Kylar、

はい、知っています。しかし、ボディを返す場合は、それを解析する必要があります。その時点で、アプリケーションロジック処理の2番目のレイヤーを導入します。これにより複雑さが増し、そのためには十分な理由が必要です。
Norbert Hartl、2011

65

私は同じ問題を抱えており、2つの異なるソリューションを使用することになりました。

  • HTTP戻りコード202: Accepted。要求は問題なかったことを示しますが、実際にすべてが正常に機能したことを保証するものではありません。
  • 200応答で通常を返しますが、応答の本文には正常に処理されなかったもののリストを含めます。

通常、2番目の方法が最もよく機能しますが、1番目の方法は、処理が遅い場合やキューを使用して処理する場合に最適です。


5
202はキューイングのようなものをもっと参照していませんか?
Sinaesthetic

6
はい、@ Sinaesthetic。最新のHTTP 1.1仕様から、「(...)リクエストは処理のために受け入れられましたが、処理は完了していません」。したがって、部分的な成功には、202は適切ではありません
Huercio

-4

206部分コンテンツの使用についてはどうでしょうか。206は範囲についての詳細ですが、部分的に正常なリクエストを示している場合はどうなりますか?


MDNは次のように述べています。「HTTP 206パーシャルコンテンツ成功ステータスレスポンスコードは、リクエストが成功し、リクエストのRangeヘッダーで説明されているように、リクエストされたデータの範囲が本文に含まれていることを示しています。」私が理解している限り、206パーシャルコンテンツは、コンテンツ範囲を含むリクエストに厳密に対応しています。
sbbs

-14

ハイパーテキスト転送プロトコルは、物事の送信側を扱います。アプリケーションレベルのエラーを処理するためのエラーコードはありません。

ここで200を返すのは正しいことです。HTTPに関する限り、要求は適切に受信され、適切に処理され、応答を送り返します。したがって、HTTPレベルではすべてがOKです。httpの上で実行されているアプリケーションに関連するエラーまたは警告は、応答内にある必要があります。そうすることで、期待した方法で特定の応答を処理できないプロキシサーバーで発生する可能性のある厄介な問題も回避できます。


18
HTTPはアプリケーションレベルのプロトコルです。トランスポートレベルとアプリケーションレベルに単純に置くことはできません。OSIについて考えると、HTTPはレイヤ5〜7にあります。HTTPは多少異なります。ヘッダーと戻りコードのほとんどは、実際にはアプリケーション固有のものです。コードは、HTTPプロトコルエンティティで提供される情報にのみ依存し、カスタムアプリケーション形式のものには依存しません。200に関しては、POSTではない動詞に適用すると、定義が完全に間違っていると言えます。しかし、POSTはゲームを少し変更し、このコンテキストでは、「適切に処理された」という仮定も不明です
Norbert Hartl

厳密に言えば、OSIはHTTPをアプリケーションレベルのプロトコルと見なし、「通常の」Webサーバーと通信する場合、これは真実です。しかし、あなたの場合、最近の多くのアプリケーションのように、HTTP上で独自のプロトコルを実行しています。そのような使用法では、HTTPはトランスポートを提供するだけです。(アプリケーションはメッセージをユーザーに送信し、ハイパーテキストを転送していません...)
AVee

2
ただ明確にします。REST方式のHTTPはリソース中心です。このコンテキストでは、200はIDの方向を指す3xxではなくID(指定したリソース)を意味します。POSTを使用すると、リソースURIが処理URIになり、それに対処する必要のあるエラーコードがあります。コンテキストが少しシフトし、物事の定義が少しぼやけるか、少なくとも理解するのが困難になります
Norbert Hartl

1
コンテキストのシフトは、プロトコルがそのコンテキストを考慮して設計されたことがないため、適切なエラーコードがないことも意味します。カスタムエラーページ、これは実際のPITAになる可能性があります。
AVee

1
とにかく、私の質問に答えてくれてありがとう。私はちょうどstackoverflowが悪いチャットクライアントであることを発見しました:)
Norbert Hartl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.