HATEOAS REST APIの「無効な操作」ステータスコード


8

HATEOAS APIでは、可能な状態遷移を表すリンクが返されます。適合クライアントはそれらのリンクを取得してたどるだけですが、不適合クライアントが提供されたリンクをたどるのではなくURIを構築している場合、返される最も適切なステータスコード/応答は何でしょうか?

  • 400は、応答本文のいくつかの情報と一緒に機能します-これは私たちが現在行っていることです
  • 403リクエストが機能しない可能性があることを意味するため、間違っていると思いますが、将来的にリンクが使用可能になる可能性があります
  • 404はもっともらしいようです-この時点ではリソースは存在しません

人々はどう思いますか?条件付き要求は古い応答(結果として412sなど)に基づいて要求を処理できることを知っていますが、これは少し異なる状況です。

更新:

これらのタイプの無効な操作に対する正しい応答は404であることがわかりました。リクエストの構文が正しい場合、有効なリソースに送られますが、ビジネスルールに違反しています。次に、いくつかの不自然な例を示します。

  1. クライアントが、互いに20%以内でなければならない2つの数値を提供できるとしましょう。
  2. クライアントがいくつかの計算を経た数値を提供できるとしましょう。その結果は、提供された元の数値が正しくなかったことを示しています。

400はこれらの正しい応答ですか?


回答:


5

リンクが将来存在する可能性がある場合、400 Bad Request403 Forbiddenはどちらも正しくありません。RFC2616の関連セクションには、クライアントがリクエストを繰り返さないようにという指示があります。2つの違いは、400 Bad Requestの場合、サーバーはクライアントが何をしようとしているかを理解しなかったのに対し、403 Forbiddenの場合、サーバーは要求を理解しましたが、それを実行することを拒否します(これまで)。

要求が理解されたことをクライアントに示したいが、要求時にそれを処理しないだけの場合(ただし、将来の処理については主張しない)、404 Not Foundが最も適切な応答です。送信します。

リクエストが理解されたことをクライアントに示したいが、リクエストが所定のルールまたはガイドラインに従っていない場合(たとえば、クライアントが互いに20%以内に2つの数値を提供していない例)、409競合を使用する必要があります。リクエストを適切に処理するために修正する必要があることをクライアントに示すことを目的としています。

ただし、善意の不適合と悪意のある不適合を区別する必要があります。悪意のあるアクターからのリクエストからアプリケーションを保護しようとしている場合、悪意のあるアクターは、送信する応答コードを気にすることはほとんどありません。好きなものにヒットするまで、URLを構築し続けるだけです。


それは問題の核心に到達すると思います。無効な操作の幅広い範囲をカバーするために少し拡張しました-おそらくこれらの400については正しい応答でしょうか?
FinnNk 2012年

@FinnNkいいえ、400 Bad Requestは、サーバーがクライアントが何をしようとしていたのかまったく理解できない場合のみです。リクエストは理解したが、リクエストの内容が無効な場合は、409 Conflictで応答します。

2

これらのコードは、HTTP rfcによって設定された標準に従います

ステータスコードの定義のセクションによると:

  • 400不正なリクエスト

不正な構文のため、サーバーはリクエストを理解できませんでした。クライアントは変更なしでリクエストを繰り返すべきではありません。

  • 403 Forbidden

サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。承認は役に立たず、リクエストは繰り返されるべきではありません。リクエストメソッドがHEADではなく、サーバーがリクエストが実行されなかった理由を公開したい場合は、エンティティで拒否の理由を説明する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータスコード404(見つかりません)を使用できます。

  • 404が見つかりません

サーバーは、Request-URIに一致するものを検出しませんでした。状態が一時的であるか永続的であるかは示されません。410(Gone)ステータスコードは、内部的に構成可能なメカニズムによって、古いリソースが永続的に利用できず、転送アドレスがないことをサーバーが認識している場合に使用する必要があります(SHOULD)。このステータスコードは、サーバーが要求が拒否された理由を正確に明らかにしたくない場合、または他の応答が該当しない場合に一般的に使用されます。

あなたの場合、構築されたURIがどこもつながらない場合は、404返すのが適切だと思います。

また、URIは有効であるが、渡されたデータ(json docなど)が壊れている場合は、400返す必要があります。

編集

OPコメントへの回答:構文とデータの意味が壊れている場合、システムは400返す必要があると思います。


壊れたことにより、REST APIのコンテキストでは、構文を意味するだけですか、それともデータの意味も含まれますか?詳細については、拡張質問を参照してください。
FinnNk 2012年

どちらの場合も、私の考えでは400を返すはずです。
karlphillip

回答を受け入れましたが、コメントを回答本文に移動できますか?乾杯。
FinnNk 2012年

HTTP rfcを再読み込みすると、Markのさらなる応答は非常に理にかなっているので、受け入れられた回答を切り替えました。ここで私の理解を深めたのは、両方の答えの組み合わせであったと言わざるを得ません。
FinnNk 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.