[解決済み] REST、HTTP DELETEとパラメータ
質問
HTTP DELETE リクエストにパラメータを提供することは RESTful ではないのですか?
私のシナリオは、"Are you sure you want to delete that?" シナリオをモデル化していることです。場合によっては、リソースの状態から、要求された削除が無効である可能性があることを示唆しています。削除の確認が必要ないくつかのシナリオを自分で想像できるかもしれません。
私たちが採用した解決策は、削除リクエストにパラメータを渡して、削除を続行してもよいことを示すことです ("?force_delete=true")。
例
DELETE http://server/resource/id?force_delete=true
から、やはりレストフルだと思います。
(a) DELETE のセマンティクスは変更されていません - ユーザーは通常の DELETE リクエストを送ることができますが、この は失敗するかもしれません。 409 で失敗する可能性があり、応答の本文でその理由が説明されます。私が失敗するかもしれないと言うのは、(説明する価値のない理由で) 場合によっては、ユーザーに促す理由がないからです。
(b) Royの論文には、それがRESTの精神に反することを示唆するものは何もありません。HTTPはRESTの1つの実装に過ぎないので、なぜHTTPパラメータを渡すことが問題になるのでしょうか?
誰か、これがRESTfulでない理由を釘付けにする決定的な文章を指し示してくれませんか?
関連した質問ですが、ユーザーがforce_deleteを指定しない場合、私は以下を返します。
409 Conflict
- を返していますが、これは最も適切な応答コードでしょうか?
フォローアップ
さらに調査した結果、DELETEにパラメータを追加することは、いくつかの原則に違反する可能性があると思います。
1つ目は、その実装はおそらく "Uniform Interface" に違反しているということです (次のセクション 5.1.5 を参照してください)。 Roy の学位論文
force_delete'を追加することで、すでによく定義されているDELETEメソッドに追加の制約を追加することになります。この制約は我々にとってのみ意味があります。
また、確認ダイアログは本当にUIの問題であり、またすべてのクライアントが削除を確認したいわけではないので、それは "5.1.2 Client-Server" に違反していると主張することもできます。
どなたかご提案いただけませんか?
どのように解決するのですか?
いいえ、それはRESTfulではありません。唯一の理由は、動詞を置くことです (
force_delete
) を URI に入れる唯一の理由は、PUT/DELETE メソッドが使用できない環境で GET/POST メソッドをオーバーロードする必要がある場合です。DELETEメソッドの使用から判断すると、これはそのようなケースではないでしょう。
HTTPエラーコード
409/Conflict
は、RESTful サービスが操作を実行できないような競合がある場合に使用されるべきですが、ユーザーが競合を自分で解決できる可能性も残っています。削除前の確認 (削除を妨げる実際の競合がない場合) は、要求された操作を API が実行することを妨げるものがないため、それ自体は競合ではありません。
Alexが言ったように(誰が彼をdownvotedしたのか知りません。彼は正しいです)、これはUIで処理されるべきです。そのようなRESTfulサービスは単にリクエストを処理し、したがってステートレスであるべきです(すなわち、リクエストに関するサーバー側の情報を保持して確認に頼ってはいけません)。
UIでこれを行う方法の2つの例は次のとおりです。
- HTML5以前 :* ユーザにJS確認ダイアログを表示し、ユーザが確認した場合のみリクエストを送信する。
- HTML5 :* DELETE アクションのフォームを使用し、フォームには "Confirm" と "Cancel" ボタンしかありません ("Confirm" は送信ボタンになります)。
(*) HTML バージョン 5 より前のものは、PUT および DELETE HTTP メソッドをネイティブにサポートしていないことに注意してください。ただし、最新のブラウザのほとんどは、AJAX 呼び出しによってこれら 2 つのメソッドを実行できます。以下を参照してください。 このスレッド を参照してください。
更新
(追加調査および議論に基づき)。
サービスが必要とするシナリオは
force_delete=true
フラグが必要であるというシナリオは
統一インターフェース
に違反します。また、以下のように
HTTP RFC
によると、DELETE メソッドはオリジンサーバー (クライアント) で上書きすることができ、これはターゲットサーバー (サービス) では行われないことを意味します。
したがって、サービスが DELETE リクエストを受け取ったら、(サービスが実際に操作を実行するかどうかにかかわらず)追加の確認を必要とせずに処理する必要があります。
関連
-
[解決済み] URI、URL、URNの違いは何ですか?
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み] updateとdeleteのHTTPステータスコード?
-
[解決済み] カスタムHTTPヘッダー:命名規則
-
[解決済み] PUT、DELETE、HEADなどのメソッドは、ほとんどのウェブブラウザで利用可能ですか?
-
[解決済み] URLクエリパラメータを含むHTTP POST -- 良いアイデアかどうか?
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み】REST APIでのPUTメソッドとPATCHメソッドの使い分け 実生活でのシナリオ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] POSTとPUT HTTP REQUESTの違いは何ですか?
-
[解決済み] HTTP DELETE リクエストにエンティティボディは許されますか?
-
[解決済み] PUT、DELETE、HEADなどのメソッドは、ほとんどのウェブブラウザで利用可能ですか?
-
[解決済み] ファイルのダウンロードにContent-Type: application/octet-streamは必要ですか?
-
[解決済み] ブラウザのCookieドメインはどのように機能するのですか?
-
[解決済み】cURLを使用してBasic HTTP認証を正しく定義する方法は?
-
[解決済み】URLのアンパサンドのエスケープについて
-
[解決済み】302と307のリダイレクトの違いは何ですか?
-
[解決済み】CURL コマンドライン URL パラメータ
-
[解決済み】サーバーサイドアプリケーション(PHP、Ruby、Pythonなど)でURLのハッシュ部分を読み取ることはできますか?)