web-dev-qa-db-ja.com

REST-API、無効なDELETEの適切なHTTPステータスコード

通信の主要コンポーネントとして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の悪い要求を投げて、とにかく誰も気にしない」だけです。迅速な修正が必要な問題はありません。実用的なハック。ありがとう)

17
Cleric

一般的なポインタ:リソースは存在するが、ユーザーがそのリソースに対して操作を実行することを許可されていない場合は、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に切り替えるのは好きではありません。

状況に応じて異なるステータスコードを返すことはまったく問題ありません。

これが少しお役に立てば幸いです。

14
Tim Castelijns

無効な削除呼び出しの応答コードは、失敗の内容によって異なります。あなたの場合、私は一緒に行きます:

  • 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/403401は「まだログインしていません」です。 403は「ログインしていて、やりたいことをする権限がありません」です。これらのコードの使用法に異常は見られません。

とはいえ、どういうわけか質問を誤解しているような気がします。

4
Eric Stein

リソースが見つからない(または、そのことについてはプットやパッチの)削除の失敗を表すという404のアイデアは好きではありません。 DNSの問題が発生し、実際のサイトが見つからなかった場合に両方とも404が発生するパラメータベースのルーティングの問題が発生することはかなり一般的です。このタイプのあいまいさを導入すると、単純な問題の診断が実際に不必要に困難になる可能性があります。 APIに関しては410 Goneは、見つからないリソースを表すためのより良い選択ですと思います。

1
Marc Ziss