web-dev-qa-db-ja.com

親リソースが見つからない場合のPOSTに対する適切な応答ステータスコードは何ですか?

私は次のエンドポイントを持っています:

a/{id}/b

bリクエストを送信してPOSTを作成したい。指定された{id}を含むaが見つからない場合、404 NOT_FOUNDまたは409 CONFLICTで応答する必要がありますか?

それは単純なa/{id}を処理することです。ここでの秘訣は、ここでサブリソースが使用されることです。

10
Opal

404 NOT FOUNDこのIDのリソースが存在しないため、適切な応答のようです。理解することは非常に明確であり、a/{id}が呼び出されます。

409 CONFLICT親リソースがnot found :)だった場合に409が返されるため、私には適切な選択ではないようです。

しかし、最も重要なことはAPIで一貫していることを覚えています

15
Dherik

@Dherikの答えに加えて。

URIは識別子であるため、(/a/{id}/bは識別子です)。 [〜#〜] uri [〜#〜] はWWWでは意味がなく、HTTPクライアントでも意味がありません。

404 が正しい答えです。本質的に、サーバーは応答しています

そのようなIDのリソースは見つかりませんでした。 リソースが見つかりません 1

不足しているリソースがparentであるかchildであるかは関係ありません。

開発者は、URIで階層と paths を確認できますが、HTTPクライアントでは確認できません。言い換えれば、HTTPは人間(開発者、エンドユーザーなど)によってではなく、HTTPクライアントによってのみ解釈されることを意図しています。

疑問がある場合は、あなた(人間)にとって意味のあるコードを尋ねないでください。質問してください。HTTPクライアントにとって意味のあるコードは何ですか。 HTTPクライアントをどのように動作させますか?

どうして?一部のステータスコードにより、これらのクライアントは特定の操作を実行するためです。たとえば、2のようになります。通常、このコードにより、Webブラウザーは応答ヘッダーで通知される特定の場所(URI)にリダイレクトします。

これはあなたのケースではないかもしれませんが、注意することが重要です。最終的に、HTTPステータスコードはHTTPクライアントに送信されます。私たちのアプリケーションではありません。人にではありません。


1:409は、ナビゲーションエラーとして実装されることはほとんどありません。通常、リモート操作(削除、更新、新規など)の実行が含まれます。しかし、URIは存在するはずです。それ以外の場合は、404が優先されます

4
Laiv