HTTP 1.1仕様では、DELETE要求でメッセージ本文を許可しているように見えますが、定義されたセマンティクスがないため、サーバーはそれを無視する必要があることを示しているようです。
4.3メッセージ本文
サーバーは、要求に応じてメッセージ本文を読み取って転送する必要があります。リクエストメソッドにエンティティ本体に定義されたセマンティクスが含まれていない場合、リクエストを処理するときにメッセージ本文を無視する必要があります。
SO以降のこのトピックに関するいくつかの関連するディスカッションをすでに確認しました。
ほとんどの議論は、DELETEでメッセージ本文を提供することが許可される可能性があることに同意しているようですが、一般的には推奨されていません。
さらに、さまざまなHTTPクライアントライブラリの傾向に気づきました。これらのライブラリでは、DELETEのリクエスト本文をサポートするために、ますます多くの拡張機能がログに記録されているようです。ほとんどの図書館は義務を負っているようですが、初期の抵抗が少しあることもあります。
私のユースケースでは、DELETEに必要なメタデータを追加する必要があります(たとえば、削除の「理由」と、削除に必要な他のメタデータ)。私は次のオプションを検討しましたが、どれも完全に適切であり、HTTP仕様やRESTのベストプラクティスに沿っているようには見えません。
- メッセージ本文-仕様は、DELETEのメッセージ本文にセマンティック値がないことを示しています。HTTPクライアントでは完全にはサポートされていません。標準的な慣行ではありません
- カスタムHTTPヘッダー-カスタムヘッダーを要求することは、一般的に標準的な慣行に反します。それらを使用することは私のAPIの他の部分と矛盾しており、いずれもカスタムヘッダーを必要としません。さらに、悪いカスタムヘッダー値を示すために利用できる良いHTTP応答がありません(おそらく完全に別の質問)
- 標準のHTTPヘッダー-適切な標準ヘッダーはありません
- クエリパラメータ-クエリパラメータを追加すると、削除されるRequest-URIが実際に変更されます。標準的な慣行に対して
- POSTメソッド-(例
POST /resourceToDelete { deletemetadata }
)POSTは削除のセマンティックオプションではありません。POSTは、実際には必要な反対のアクションを表します(つまり、POSTはリソースの従属を作成しますが、リソースを削除する必要があります) - 複数のメソッド-DELETEリクエストを2つの操作(たとえば、PUTメタデータの削除、次にDELETE)に分割すると、アトミック操作が2つに分割され、一貫性のない状態が残る可能性があります。削除理由(およびその他の関連メタデータ)は、リソース表現自体の一部ではありません。
私の最初の好みは、おそらくカスタムHTTPヘッダーの次にメッセージ本文を使用することでしょう。ただし、示されているように、これらのアプローチにはいくつかの欠点があります。
DELETEリクエストにそのような必要なメタデータを含めるためのREST/HTTP標準に沿った推奨事項またはベストプラクティスはありますか?私が検討していない他の選択肢はありますか?