通信の主要コンポーネントとしてHTTPステータスコードと動詞を使用するRESTfulAPIを設計しています。
宗教的なレベルでは、それはRESTafarianの熱心な側にあります。
HTTPステータスコードを決定するための経験則は このグラフ または同様のリソースです。
GET /api/documents/1
--401
ユーザーがログインしていませんGET /api/documents/1
--200
ユーザーには権限がありますGET /api/documents/1
--403
ユーザーに権限がありませんDELETE /api/documents/1
--204
ユーザーには権限がありますDELETE /api/documents/1
--403
ユーザーに権限がありませんGET /api/documents/2
--404
ユーザー権限は関係ありません、リソースは存在しませんDELETE /api/documents/2
--404
ユーザー権限は関係ありません、リソースは存在しませんDELETE /api/documents/1
--404
ユーザーには権限があり、リソースはすでに削除されていますDELETE /api/documents/1
--404
ユーザーには権限がなく、リソースはすでに削除されています目標:
この状況では、選択できるさまざまなステータスコード(404、403、410、405)がたくさんあります。私の場合、キャッシュをクリアしないのであれば既存のリソースで403を使用し、すべてのリソースで404を使用しました。クライアントにそのデータをワイプするように指示するための既存のリソース。
しかし、私はあなたのものではないリソースの403から404への切り替えが好きではありません。
このユースケースをどのように解決したか、または一般に、すべての無効なDELETE呼び出しで送信するのに適切と思われるステータスコードを他の人から聞いてみたいと思います。これは、簡潔にするのが最も難しいものの1つだと思います。
(インターネット上でのRESTの議論と回答の多くは、「400の悪い要求を投げて、とにかく誰も気にしない」だけです。迅速な修正が必要な問題はありません。実用的なハック。ありがとう)
一般的なポインタ:リソースは存在するが、ユーザーがそのリソースに対して操作を実行することを許可されていない場合は、401 over403を返す必要があります。
401無許可
403 Forbiddenに似ていますが、特に認証が必要で失敗した場合、またはまだ提供されていない場合に使用します。
そして
403禁止します
リクエストは有効なリクエストでしたが、サーバーはそれに応答することを拒否しています。 401 Unauthorized応答とは異なり、認証は違いを生みません。
参照 リソースは使用可能であるが、アクセス許可のためにアクセスできない場合のHTTPステータスコードを修正
キャッシュをクリアしない場合は既存のリソースで403を使用し、存在しないすべてのリソースで404を使用して、クライアントにそのデータをワイプするように指示しました。
前に指摘したように、403の代わりに401を使用する必要があります。「申し訳ありませんが、リソースが見つかりません」とだけ言いたい場合は、404を返しても問題ありません。ただし、「リソースはここにありましたが、もう存在せず、二度と存在しない」と言いたい場合(これはあなたの状況に当てはまるようです)、410を返すことができます。
410ゴーン
要求されたリソースが使用できなくなり、再び使用できなくなることを示します。これは、リソースが意図的に削除され、リソースがパージされる必要がある場合に使用する必要があります。 410ステータスコードを受け取ったクライアントは、今後リソースを再度要求しないでください。検索エンジンなどのクライアントは、インデックスからリソースを削除する必要があります
要約すると、これは私があなたの場合にそれを実装する方法です。私が行った変更は太字です。
GET /api/documents/1
--401
ユーザーがログインしていませんGET /api/documents/1
--200
ユーザーには権限がありますGET /api/documents/1
-401ユーザーに権限がありませんDELETE /api/documents/1
--204
ユーザーには権限がありますDELETE /api/documents/1
-403ユーザーに権限がありませんGET /api/documents/2
--404
ユーザー権限は関係ありません、リソースは存在しませんDELETE /api/documents/2
--404
ユーザー権限は関係ありません、リソースは存在しませんDELETE /api/documents/1
-410ユーザーには権限があり、リソースはすでに削除されていますDELETE /api/documents/1
-401ユーザーに権限がなく、リソースは既に削除されています最後の1つでは、許可されていないユーザーに、すでに削除されたリソースがあったことを知られたくない場合は、401を返すことができます。気にしない場合は410を返すことができます。それはあなたが決めることです。
あなたのものではないリソースで403から404に切り替えるのは好きではありません。
状況に応じて異なるステータスコードを返すことはまったく問題ありません。
これが少しお役に立てば幸いです。
無効な削除呼び出しの応答コードは、失敗の内容によって異なります。あなたの場合、私は一緒に行きます:
DELETE /api/documents/1
-ユーザーには権限があります204 No Content
DELETE /api/documents/2
-ユーザー権限は関係ありません、リソースは存在しません404 Not Found
DELETE /api/documents/1
-ユーザーには権限があり、リソースはすでに削除されています410 Gone
DELETE /api/documents/1
-ユーザーには権限がなく、リソースはすでに削除されています403 Forbidden
最後の呼び出しは、本当に話す価値のある唯一の呼び出しです。私は、ユーザーの許可の欠如が、すでに削除されているリソースよりも優先されると信じています(そしてあなたのグラフは同意します)。ユーザーが410を取得した場合、情報が漏洩することになります(リソースはすでに削除されています)。
の限り 401
/403
、401
は「まだログインしていません」です。 403
は「ログインしていて、やりたいことをする権限がありません」です。これらのコードの使用法に異常は見られません。
とはいえ、どういうわけか質問を誤解しているような気がします。
リソースが見つからない(または、そのことについてはプットやパッチの)削除の失敗を表すという404のアイデアは好きではありません。 DNSの問題が発生し、実際のサイトが見つからなかった場合に両方とも404が発生するパラメータベースのルーティングの問題が発生することはかなり一般的です。このタイプのあいまいさを導入すると、単純な問題の診断が実際に不必要に困難になる可能性があります。 APIに関しては410 Goneは、見つからないリソースを表すためのより良い選択ですと思います。