データ サービスの削除の取り消しまたは遅延/バッチ削除をサポートすることは、かなり一般的な要件です。私が疑問に思っているのは、これを RESTful な方法で実装する方法です。私はいくつかの異なるオプションの間で引き裂かれています (どれも私にとってひどく魅力的ではないようです)。これらのさまざまなオプションに共通するのは、特定のリソース タイプに対して削除済みとしてマークされたすべてのリソースを返す API の必要性だと思います。
私が考えたいくつかのオプションと、それらの長所と短所のいくつかを次に示します。
リソースを削除済みとしてマークするオプション:
- HTTP DELETE を使用して、リソースを削除済みとしてマークします。
- HTTP PUT/POST を使用して、削除済みフラグを更新します。これは、本質的に削除を HTTP DELETE メソッドから離れて他の HTTP メソッドにマッピングするため、適切ではありません。
削除対象としてマークされたリソースを GET するときのオプション:
- 削除済みとしてマークされたリソースの HTTP ステータス 404 を返します。クリーンで透過的ですが、実際に削除されたリソースと削除済みとしてマークされたばかりのリソースの違いはどうすればわかりますか。
- HTTP ステータス 410 を返します。違いを見分ける方法を提供しますが、410 は技術的には「永続的であると見なされることが期待されます。リンク編集機能を持つクライアントは、ユーザーの承認後に Request-URI への参照を削除する必要があります」と述べています。ここでの「期待される」および「すべき」という言葉には、十分な調整の余地があるかもしれません。クライアントで 410 がどの程度サポートされているか、または理解されているかは不明です。
- HTTP ステータス 200 を返し、リソースが削除されたことを示すフラグ フィールドを含めます。そもそもそれを削除するという考えは、実際には表示されないようにしたかったからです。これにより、削除されたリソースを除外する責任がクライアントに押し付けられます。
この削除されたリソースを含む応答のオプション:
- 削除済みとしてマークされたリソースを省略します。クリーン&シンプル。しかし、削除されたリソースについて実際に知りたい場合はどうでしょう。
- それらが削除されたことを示すフィールドとともにそれらを含めます。これにより、削除されたリソースを除外する責任がクライアントに押し付けられます。アクティブなリソースまたは削除されたリソースのみをページングしたい場合、ページネーションが難しくなります。
削除対象としてマークされたリソースを更新するときのオプション:
- HTTP ステータス 404 を使用します。リソースがなくなりましたよね? しかし、削除済みとしてマークされたリソースと実際に削除されたリソースの違いをどのように見分けることができますか。404 応答の HTTP 本文はここで明確にすることができますが、クライアントは本文を解析/解釈して明確にする必要があります。たぶん、応答ヘッダーがここで役立つでしょうか? どれ?カスタムヘッダー?
- リソースを最初に復元する方法についてのメッセージとともに HTTP ステータス 409 を使用します。
削除対象としてマークされたリソースの削除を取り消すオプション:
- リソースの更新操作に HTTP PUT/POST を使用し、再度アクティブとしてマークします。これは、「見つかりません」(404) であるリソースに PUT/POST を実行しないため、リソースの GET 操作に対して HTTP 404 を返さない場合にのみ機能します。
- リソースの作成操作には HTTP PUT/POST を使用します。ここでの問題は、どのデータが優先されるかということです。作成操作で送信されたデータ? それとも復元されたデータですか?それを返す他のクエリからそれを除外します。次に、リソース識別子が削除済みとしてマークされたリソースを指している場合、リソースを作成する HTTP PUT/POST を削除取り消しとして扱います。
- 削除対象としてマークされたリソースの削除を取り消す専用の別の REST パス。
これは決して網羅的なリストではありません。頭の中で飛び回っているいくつかのオプションを列挙したかっただけです。
これを行う方法に対する答えは、いつものように「場合によります」であることを私は知っています。私が興味を持っているのは、決定を下すためにどのような資格/要件を使用するかということです. これが実装されているのをどのように見ましたか、または自分で実装しましたか?