ユーザーレコードを非アクティブにするRESTful APIコマンドを作成しています。レコードが "非アクティブ"状態に更新されているので、これを行うにはDELETEを使用するのがよいでしょうか?これはPUTですか?それとも趣味の問題ですか?HTTP DELETEを使用してレコードを非アクティブにすることはできますか?
9
A
答えて
8
セマンティクスDELETE
は、実際にオブジェクトを削除していることを意味します。あなたがここでやっていることは、オブジェクトの状態の変更のようです。この場合、PUT
またはPATCH
がより適切です。
使用している統一インターフェイスのセマンティクス(この場合はHTTP動詞)を守る方がよいでしょう。それらがあなたのアプリ内で実際にやっていることと一致すれば、混乱は少なくなります。また、後でDELETE
がレコードを "非アクティブ"とマークするのではなく、実際に削除することを決定したらどうしますか?これで、APIの動作が変更されました。また、DELETE
を使用している場合、基本的に「最小の驚きの原則」に従います。これはAPIに適しています。 DELETE
を実際に削除するのではなく、削除することをお勧めします。
一方、レコードをある場所から削除して、歴史的な目的でデータを保持する必要があることが判明した場合は、別の場所(レコードを別のテーブルに移動するなど)に移動しても問題ありません。この場合、そのレコードは今後の操作で使用できなくなります(つまり、リソース上のGET
は404
を返します)。
4
無効にした操作の後に、再度アクティブにしない限り、「GET」によってエンドユーザーがリソースにアクセスできなくなると、「DELETE」を使用しても問題は発生しません。それ以外の場合は、「PUT」が適切です。
3
DELETE
リクエストを送信したURLのリソースがそのURIで使用できなくなった場合は、DELETE
が適切です。それがそこに残っているが状態を変えれば、そうではありません。
GET /friends/bob => 200 OK
GET /formerfriends/bob => 404 Not Found
DELETE /friends/bob => 204 No Content
GET /friends/bob => 410 Gone
GET /formerfriends/bob => 200 OK
これではありません:
GET /friends/bob => 200 OK {"status"="friend"}
DELETE /friends/bob => 204 No Content
GET /friends/bob => 200 OK {"status"="formerfriend"}
;(新しいリソースがプロセス中/ formerfriends /ボブに作成され、それは付随するリソース友人/ボブが消える/時)、これは大丈夫です
そのようなことは、より良いPUT
またはPATCH
で扱うことになります。
GET /friends/bob => 200 OK {"status"="friend"}
PATCH /friends/bob {"status"="formerfriend"} => 204 No Content
GET /friends/bob => 200 OK {"status"="formerfriend"}
関連する問題
- 1. "delete from"ステートメントを使用して2つのレコードをマージすることはできますか?
- 2. ajaxのHTTP DELETEリクエストにリクエストパラメータを追加することはできますか?
- 3. アクティブなレコードを使用するテーブルの複合主キーを定義することはできますか?
- 4. NSISでhttp getとhttp postを使用することはできますか?
- 5. CSSでリンクを非アクティブにすることはできますか?
- 6. laravel delete関数を使用してレコードを削除する
- 7. レコードをレコード要素として使用することは可能ですか?
- 8. Jqueryを使用してボタンをクリックしてテキストをアクティブ/非アクティブにする
- 9. DELETEをASP.NET MVC 3+のHttpVerbとして使用することはできますか?
- 10. HTTP DELETEを使用してJerseyClientBuilderでフォームデータを渡す方法
- 11. 'delete'を使用して 'malloced'メモリを解放できますか?
- 12. javascriptを使用してWindowsアプリケーションウィンドウをアクティブにすることはできますか?
- 13. tcp、http、websocketをすべて同じポートを使用して有効にすることはできますか?
- 14. ここで `disableDeprecatedForms()、provideForms()`をRC5で使用しますか?古いフォームを非アクティブにしなく
- 15. ステータスが非アクティブのときは、トグルがアクティブのままです。
- 16. プリミティブでdeleteを呼び出すことはできますか?
- 17. SRVレコードでIPアドレスを使用することはできますか?
- 18. yii2アクティブなレコードとリレーションを使用してデータを取得する方法は?
- 19. Apache HTTPを使用してhttpsにPOSTすることができません
- 20. 「HTTP POST」で「dataWithContentsOfURL」を使用することができます
- 21. codeigniterの制限1で更新すると、アクティブなレコードを使用します
- 22. free()をmalloc()で新しい&deleteで使用することはできますか?
- 23. c#とカスタムHTTPハンドラを使用してバイナリイメージをデータベースに書き込むことはできますか?
- 24. rowtypeを使用してレコードにカーソルをフェッチすることはできますか?
- 25. RESTful MVCフレームワークでHTTPリダイレクトを使用することはできますか?
- 26. jqueryを使用してimgを非表示にできませんか?ここ
- 27. 角とストライプ、$ httpを使用してカードトークンを作成することはできませんが、CURLを使用することができます
- 28. CallContext.SetData() - スレッドがアクティブ - 非アクティブ - アクティブ(TPL)になったときに使用可能なオブジェクトですか?
- 29. アクティブなタブは、CSSを使用して非アクティブなタブを指していますか?
- 30. このステートメントを使用してmysqlからレコードを削除することはできません
ほんの少し加え:[RFC-2616]によると、(http://tools.ietf.org/html/rfc2616#section-9.7 )サーバーは、リソースをアクセスできない場所に移動します。最後に、削除されたリソースの 'GET'は' 404'を返します。 – prehfeldt
@prehfeldt正解!私は私の最後の段落でそれを言いました。追加の説明のために '404'についてのビットを追加しました。 –