一方でHTTP 1.1仕様は、ように見えることを可能にメッセージ本文をDELETE要求、それのための定義された意味がないので、サーバはそれを無視すべきであることを示していると思われます。
4.3メッセージ本文
サーバーはどんなリクエストでもメッセージ本文を読んで転送すべきです。リクエストメソッドにエンティティボディの定義されたセマンティクスが含まれていない場合、リクエストを処理するときにメッセージボディを無視する必要があります(SHOULD)。
私はすでに、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標準に沿った推奨事項またはベストプラクティスはありますか?私が考慮していない他の選択肢はありますか?
Jersey
は、delete
リクエストの本文を許可していません。