21

クライアントが日常的にデータを POST および PUT する REST API があります。彼らがこれを行うと、システムに変更をもたらさないデータを投稿することがあります。POST と PUT は整形式ですが、送信しているデータはデータベース内のデータと同じです。これが発生すると、400 HTTP ステータスが返されることがわかりました。残念ながら、これは「不正な構文のためにサーバーがリクエストを理解できなかった」などの「不正なリクエスト」を意味します。

明らかにそうではありませんが、他に適切なステータス コードがないため、これを使用すると言われています。検討した選択肢:

  • 304 変更されていません。残念ながら、これは GET リクエスト専用です。
  • 204 コンテンツがありません。近いようですが、実体を禁止します。

他の選択肢も同様に悪いようです。返される XML ドキュメントに関連情報を含めることもできます200 OKが、これはあまり "REST っぽい" とは言えません。REST の世界では、一般的にこれをどのように処理していますか?

(Not Modified 応答コードを修正。Mkoeller に感謝)

4

3 に答える 3

27

その場合、200 OK を返すことはまったく問題ないと思います。データは正しく処理され、サーバーは必要なことを行いました。サーバーはデータを正しく処理したため、OK ステータス コードを返す必要があります。内部でそれを無視したという事実は、無関係である、または無関係であるべきです。

サーバーがデータに対して行ったことをクライアントに伝える必要はありません。クライアントには、リクエストに何が起こったのか (正常に処理された、エラーが発生したなど) を伝える必要があります。

そして、何らかの奇妙な理由 (有効な理由とは思えませんが) で、クライアントが関心を持っている場合は、その旨を伝える応答があります。

于 2008-11-12T14:02:55.620 に答える
3

クライアントが PUT する前にサーバー上のコンテンツのエンティティ タグを認識できる場合、If-Match ヘッダーと 412 Precondition Failed 応答を使用すると、説明した状況に正確に対応できます。

于 2008-11-13T02:25:35.463 に答える
1

クライアントから見ると、リクエストの内容がサーバー上で同じであったかどうかにかかわらず、サーバーのステータスは同じですよね? その後、サーバーは送信されたコンテンツを正確に保持するため、サーバーが何らかのエラーステータスで応答する必要があるのはなぜですか? 一方、リクエストの内容がサーバーに既に知られているものと同じである場合、クライアントはなぜ気にする必要があるのでしょうか? サーバーに正常に転送されたため、大部分の作業は完了です。この状況に対して別の応答コードがあった場合、クライアントはどのように反応すると予想されますか?

結論: 既存のコンテンツと同等のリクエスト コンテンツの状況は、特別なケースではありません。同じ応答ステータス コードで応答する必要があります。それは 200、302、または 303 かもしれません。

于 2008-11-12T14:01:30.553 に答える