REST、HTTP DELETEおよびパラメーター


135

HTTP DELETEリクエストにパラメーターを提供することに関してRESTfulでないものはありますか?


私のシナリオでは、「本当に削除してもよろしいですか?」をモデル化しています。シナリオ。場合によっては、リソースの状態は、要求された削除が無効である可能性があることを示唆しています。おそらく、自分で削除の確認が必要ないくつかのシナリオを想像できます。

私たちが採用したソリューションは、削除リクエストにパラメーターを渡して、削除を続行してもよいことを示すことです( "?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」に違反している可能性があることです(Royの論文のセクション5.1.5を参照)。

'force_delete'を追加することで、すでに適切に定義されたDELETEメソッドに制約を追加します。この制約は私たちだけに意味があります。

また、確認ダイアログは本当にUIの問題であり、すべてのクライアントが削除の確認を望んでいるわけではないため、「5.1.2クライアントサーバー」に違反していると主張することもできます。

誰か提案?


1
ロイの論文のURLに「)」が含まれているため、404が発生します。ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htmが機能します。
NuclearPeon

回答:


78

いいえ、RESTfulではありません。動詞(force_delete)をURIに入れる必要がある唯一の理由は、PUT / DELETEメソッドが利用できない環境でGET / POSTメソッドをオーバーロードする必要がある場合です。DELETEメソッドの使用から判断すると、これは当てはまりません。

HTTPエラーコード409/Conflictは、RESTfulサービスが操作を実行できないような競合がある場合に使用する必要がありますが、ユーザーが自分で競合を解決できる可能性があります。削除前の確認(削除を妨げる実際の競合がない場合)は、APIが要求された操作の実行を妨げるものがないため、それ自体は競合ではありません。

アレックスが言ったように(誰が彼に反対票を投じたのかはわかりませんが、彼は正しいです)、RESTfulサービスはリクエストを処理するだけなのでステートレスである必要があるため、UIで処理する必要があります(つまり、保持による確認に依存してはなりません)リクエストに関するサーバー側の情報)。

UIでこれを行う方法の2つの例は次のとおりです。

  • HTML5より前:*ユーザーにJS確認ダイアログを表示し、ユーザーが確認した場合にのみリクエストを送信します
  • HTML5:*フォームに「確認」ボタンと「キャンセル」ボタンのみが含まれるアクションDELETEのあるフォームを使用します(「確認」が送信ボタンになります)

(*)5より前のHTMLバージョンは、PUTおよびDELETE HTTPメソッドをネイティブでサポートしていないことに注意してください。ただし、最近のほとんどのブラウザーは、AJAX呼び出しを介してこれら2つのメソッドを実行できます。参照してください。このスレッドのクロスブラウザのサポートの詳細については、を。


更新 (追加の調査とディスカッションに基づく):

サービスがforce_delete=trueフラグの存在を必要とするシナリオは、Roy Fieldingの論文で定義されている統一インターフェースに違反しています。また、HTTP RFCに従って、DELETEメソッドはオリジンサーバー(クライアント)でオーバーライドされる場合があり、これはターゲットサーバー(サービス)では行われないことを意味します。

したがって、サービスがDELETE要求を受信すると、追加の確認を必要とせずにそれを処理する必要があります(サービスが実際に操作を実行するかどうかに関係なく)。


2
違反しているREST制約を説明できますか?URIはクライアントに対して不透明である必要があることを考えると、あるリソースを削除して別のリソースを削除できないHTTP DELETEの使用では、クライアントの期待が満たされないと考えるのはなぜですか。409が返すのに最適なステータスコードであるかどうかはわかりませんが、少し奇妙な実装であることに加えて、壊れているREST制約を見つけることができません。
Darrel Miller

2
@Darrel:(imho)DELETEメソッドがHTTP標準に従って実行しないため、統一されたインターフェースに違反します。標準のRESTサービスを前提とするRESTクライアントについて考えてみましょう。サービスは、クライアントに追加する必要があることをどのように通知しますかforce_delete=true?HTTP RFCに従って、DELETEメソッドはオリジンサーバー(クライアント)でオーバーライドされる場合があり、これはターゲットサーバー(サービス)では行われないことを意味します。したがって、サービスがDELETEリクエストを受信すると、確認を必要とせずに(サービスが実際に操作を実行するかどうかに関係なく)サービスがそれを処理する必要があることを理解しています。
MicE 2010年

1
@ Chris、2つ目のポイント:はい、それは私の理解でもあります。つまり、国家は実際の対立を示唆しており、確認の必要はないということです。私はあなたの質問であなたが行った更新に気づきました、そして私は同意します-私がそれを調べている間に、私は同じ結論に達しました(これは統一されたインターフェースに違反し、確認はクライアント/ UIで行われるべきであるということです)側)。私はここでも非常に興味深いスレッドに出くわしました、それが役立つかもしれません:mail-archive.com/pylons-discuss@googlegroups.com/msg13578.html
MicE

2
@MicEこれは、このシナリオを処理するための理想的な方法ではないことに、大部分は同意します。「RESTfulではない」というラベルについては、ちょっとうるさいだけです。ここしばらくの間、そのフレーズはすべてに投げられました。ただし、リソースを削除しようとしてエラーが発生した場合(つまり、403 forbiddenの方が409よりも優れていると言う)、メディアタイプのルールを定義して、クライアントが関連リソースでDELETEを試行するようにすることができます。 「force_delete = true」を追加します。ある意味で、それは承認のようなものです。GETを実行して401を取得し、authヘッダーを追加して、再度GETします。
Darrel Miller

2
@Darrel:それは非常に良い点です、ありがとう。そして私は、人々がRESTfulでないラベルを自分で投げるのを見てきました。現在、サービスとWebアプリケーションの間の障壁が非常にぼんやりしているため、一部の人々は純粋なサービスの観点からこれを見ることができ、他の人々はアプリケーション/サービスの混合の観点からそれを見ることができます。それは、確認を行う方法についての本当の質問が出てくるところだと私は信じています。@Chris:更新-非常に興味深いトピックとディスカッションをありがとうございます!
MicE 2010年

35

これは落ち着きのないことだと思います。残りのサービスは、ユーザーに削除の確認を強制するという要件を処理する必要があるとは思いません。これはUIで処理します。

これがプログラムのAPIである場合、force_delete = trueを指定しても意味がありますか?誰かがこのリソースを削除するスクリプトを書いている場合、force_delete = trueを指定してリソースを実際に削除するように強制しますか?


あなたの応答の最初の段落はあなたの意見であり、私はそれを尊重しますが、このようにURIの使用を禁止する文献のどこかを指摘していません-それでもリソースを識別し、最も適切なHTTP動詞が使用されています。あなたの質問に答えて; はい、それでも(私の意見では)理にかなっています。すべての私の応答の本体に基づいて-私は409応答を尊重し、要求を再送信する方法をユーザーに提案するために(おそらくCURLに基づいて)スクリプトを期待
クリスマッコーリー

Web APIをプログラムのAPIと比較することの良い点。これは多くの場合、APIがRESTfulかどうかを確認するのに適した方法です。
laurent

18

それは古い質問ですが、ここにいくつかのコメントがあります...

  1. SQLでは、DELETEコマンドはパラメーター「CASCADE」を受け入れます。これにより、依存オブジェクトも削除するように指定できます。これは意味のあるDELETEパラメーターの例ですが、「man rm」は他のパラメーターを提供することができます。これらのケースは、パラメータなしでREST / HTTPにどのように実装されますか?
  2. @Jan、それは確立された慣習のようです。URLのパス部分がリソースを識別するのに対し、クエリ文字列はそうではありません(少なくとも必ずしもそうではありません)。例は豊富です:同じリソースを取得するが異なる形式で取得する、リソースの特定のフィールドを取得するなど。クエリ文字列をリソース識別子の一部と見なす場合、「同じリソースの異なるビュー」という概念を持つことは不可能です。 HTTPコンテンツネゴシエーションなどのREST以外のメカニズム(これは、多くの理由で望ましくない可能性があります)に頼らないでください。

これは数年続くのでそれほど会話ではありませんが、これを会話に追加していただきありがとうございます。
silviot 2012年

6

アレックスの答えに加えて:

http:// server / resource / id?force_delete = trueは、http:// server / resource / idとは異なるリソースを識別することに注意してください。たとえば、/ customers /?status = oldまたは/ customers /を削除するかどうかは、大きな違いです。

ヤン


同じリソースを識別するために複数のURIを提供することは自由です。
Chris McCauley、2010年

18
うん-誰もが自由に台無しにすることができます:-)
Jan Algermissen

標準的なURIの表示がこれを助けることができる:googlewebmastercentral.blogspot.com/2009/02/...
マウス

@Chrisリソースの表現を返すURIは1つだけです。他のURIも同じ概念を参照できますが、GETを実行すると303 See Otherが返されます。そして、これに対する明白な反論に対抗するために、/ foo.xmlと/foo.jsonは2つの異なるリソースです。
Darrel Miller

@ダーレル-同意するが、フォーマットはここでは問題ではない。また、.formatはRailsやRESTの一部ではない他のフレームワークの規約です。これを完全に実装するには、MIMEまたはマイクロフォーマットを使用したHTTPのコンテンツネゴシエーションを使用する必要があります。
Chris McCauley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.