web-dev-qa-db-ja.com

REST WebサービスでアクションをトリガーするためにどのHTTP動詞を使用する必要がありますか?

RESTful Webサービスを実装しています。使用可能なアクションの1つはreloadです。設定やキャッシュなどをリロードするために使用されます。

私たちは、次のようなURIへの単純なGETから始めました:${path}/cache/reload(パラメーターは渡されず、URIのみが呼び出されます)。 GETリクエストでデータを変更しないでください。

RESTful Webサービスでアクション/コマンドを呼び出すために使用する正しい動詞はどれですか?

リロードは、独自のキャッシュ/構成などをリロードするREST Webサービスのコマンドです。これは、クライアントに情報を返すメソッドではありません。

おそらく私がやろうとしているのはRESTではありませんが、それでもこの方法で行う必要があるものです。reloadメソッドは、アプリケーションの範囲で意味のある実際の例にすぎず、ほとんどの回答はそれに焦点を当てていましたが、実際には、CRUDを実行せずにデータ/状態を変更するアクションをトリガーする動詞を知る必要がありました。

私はこの詳細なスタックオーバーフローでこの詳細を見つけました: https://stackoverflow.com/questions/16877968/

91
Renato Dinhani

このトランザクションは実際には「RESTful」ではないため、このアクションにはproper動詞はないと思います。 「s」と「t」は「状態転送」を表し、ここでは何も転送されていません。または、別の言い方をすれば、最も厳密な定義では、PUTやPOSTのような動詞は常に名詞とともに使用され、 "reload"には動詞しかありません。

このリロードはRESTfulではないかもしれませんが、それでもまだ有用である可能性があり、それを実行する方法を選択して、それが異常であると共存または説明する必要があります。 GETはおそらく最も単純です。ただし、コメントにはかなりの懐疑論があります。そのため、他の何かが本来の動作をしていないため、このリロードアクションが必要かどうかを検討する必要があります。

26
Sean Redmond

RESTfulになりたい場合は、アクションを実行する動詞を考えないでください。クライアントが何かを実行した後にリソースを入れたいstateを考えてください。

したがって、上記の例のいずれかを使用すると、電子メールを送信する電子メールキューがあります。クライアントにその電子メールキューを一時停止または停止などの状態にしてもらいます。

したがって、クライアントはそのリソースの新しい状態をサーバーにPUTします。このJSONのように単純にすることができます

PUT http://myserver.com/services/email_service HTTP/1.1
Content-Type: text/json

{"status":"paused"}

サーバーは、現在のステータス(「running」など)から「一時停止」ステータス/状態に移行する方法を把握します。

クライアントがリソースに対してGETを実行した場合、クライアントは現在の状態(たとえば「一時停止」)を返す必要があります。

このように行う理由、およびRESTが非常に強力になる理由)は、HOWを離れてサーバーの状態を取得するためです。

クライアントは"これはあなたが今あるべき状態です"と言い、サーバーはそれを達成する方法を見つけ出します。データベースの単純なフリップかもしれません。何千ものアクションが必要になる場合があります。クライアントは気にせず、知る必要もありません。

したがって、サーバーがそれを行う方法を完全に書き換え/再設計することができ、クライアントは気にしません。クライアントは、内部状態ではなく、リソースのさまざまな状態(およびその表現)を認識する必要があるだけです。

78
Cormac Mulhall

受け入れられたものを含む他の回答のいくつかは、GETを使用することをお勧めします(非常に熱心ではありません)。

同意しません。

まず第一に、これは理想的ではなく、実際にRESTfulではないとあなたに言っている他のすべてが正しいです。適切なRESTfulシナリオでは、サーバー上のリソースを操作し、それらのリソースを追加、更新、削除、取得などします。 PUTは、リクエストが完了したときのリソースを表すペイロードを送信する必要があり、POSTは、サーバーに追加されるリソースを表すペイロードを送信する必要があります。GETはサーバー上のリソース。

RESTfulではないRPC(リモートプロシージャコール)があり、サーバーで何かを実行したい。したがって、純粋にRESTfulなAPIを作成しようとしている場合は、何をしているのかを再考する必要があります。

とはいえ、ルールを少し曲げる必要がある場合もあります。特に、一般公開されない内部APIを開発している場合は、トレードオフの価値があると判断するかもしれません。

もしそうなら、RPCが べき等 かどうかに応じて、PUTまたはPOSTをお勧めします。

一般に、HTTP PUTはSQL UPDATEにマップし、HTTP POSTはSQL INSERTにマップしますが、厳密には真ではありません。HTTPPUTはべき等であり、 HTTP POSTする必要はありません。これは、同じPUTリクエストを何回でも副作用なしに呼び出すことができることを意味します。一度呼び出した後、それを呼び出すことは無害です繰り返しますが、POSTリクエストは、意図しない限り繰り返し呼び出さないでください。各POSTは、サーバー上のデータを再度変更します。

あなたの場合、このリロード機能が必要な場合は、べき等のように聞こえるため、PUTをお勧めします。しかし、私はあなたに、他の人がそれをまったく必要としないことについて言ったことを考慮するようにあなたに強く要請します。

33
Aaron Greenwald

POSTおよびPUTは、エンティティをWebサーバーに送信するために使用されるHTTP動詞です。 PUTの場合、送信されたエンティティは、指定されたURIのリソースの(新しい)表現であり、必要なものに適合しません。 POSTは、エンティティがリソースの補助データである従来のフォームハンドラ用であり、これが勝者です。エンティティにはコマンドまたはアクションが含まれます(例: "action = reload")。

つまり、問題のコマンドはおそらくRESTインターフェイスを介して公開するべきではありません。データは他のチャネル(ファイルシステムなど)を介して変更できるため、「リロード」の必要性が生じるようですDBクライアント。キャッシュは透過的である必要があります。さらに、HTTPリクエストはアトミックである必要があり、他のチャネルを介して送信されたメッセージも考慮に入れます。構成設定に「reload」コマンドを提供することは不必要な複雑さのように見え、それを要求するのは脆弱な設計です。 1つのチャネルには会話全体が含まれていないため、別のチャネルを介した更新がダーティである場合、クリーンアップするために "reload"を使用します。代わりに、次のいずれかを検討してください。

  • rESTを介して完全に更新する
  • コマンドを他のチャネルに公開する
  • アクションの自動化

他にどのような制限が存在するかによって、これらのオプションの一部は実行できない場合があります。

PUT vs POST 」も参照してください。

6
outis

クライアント要求がそのような何かを更新するために明示的に呼び出しを行う必要がある理由を私は主張します。それは、GETのより一般的な実装(つまり、データをプルするが、サービスはデータがプルされる前にデータを更新する)の非表示ロジックであるか、クライアントから離れたバックエンドの別のトリガーによるものであるように思えます。

結局のところ、data/configは後続の呼び出しで最新である必要があるだけなので、データ更新の遅延呼び出しと熱心な呼び出しの方を重視します。明らかにここでは多くのことを想定していますが、そのような明示的でスタンドアロンの呼び出しの必要性を再評価するために、一歩戻ります。

4
Thomas Stringer

アクションをリソースのように扱ってみませんか。したがって、キャッシュを更新したいので、POSTシステムで新しいアクションを実行します。

純粋主義者には、そのための専用のURLを用意できます。これを拡張して、日付、ステータス、ユーザーなどを含むデータベース(または任意のストレージ)に実際のアクションを記録できることに注意してください。

一般的なシステム全体の操作/ actions/{action}

リソースタイプ/ actions/{resource}/{action}に固有の操作

リソースに固有の操作/ actions/{resource}/{id}/{action}

あなたの場合、キャッシュはおそらくシステム全体の/ actions/reload_cacheです

3
Isometriq

REST WebサービスでアクションをトリガーするためにどのHTTP動詞を使用する必要がありますか?

RESTサービスの詳細を検討する場合、このヒューリスティックを検討することはしばしば役立ちます。これをWebサイトでどのように実装しますか?

HTMLはネイティブでGETおよびPOSTリクエストのみを記述できます。したがって、そこから検索を開始できます。

GETは適切ですか?この質問に答えるには、クライアントと中間コンポーネントがGETについて作成を許可されているという仮定について考える必要があります。 GETのセマンティクスは safe です

クライアントは、ターゲットリソースに安全なメソッドを適用した結果として、Originサーバーの状態変化を要求したり、予期したりしません。同様に、安全な方法を合理的に使用しても、Originサーバーに害、財産の損失、または異常な負担が発生することは想定されていません。

そのため、クライアントと中間コンポーネントは、独自の懸念を満たすために必要な頻度でGET要求を呼び出す裁量権を持っています。スパイダーは無差別にリソースを取得してインデックスを更新できます。キャッシュはプリフェッチできます。信頼性の低いネットワークでは、失われたメッセージを必要な頻度で再試行して、少なくとも1つの応答を保証できます。

設定やキャッシュなどをリロードするために使用されます。

これらが高価な作業である場合、クライアントが独自の裁量でこれらの要求を発行することを望まない場合があります。

一方、POSTは実質的に制約がありません。これにより、一般的なクライアントが行うことができる仮定が大幅に削減されます。投機的なPOSTリクエストを行うコンポーネントは取得に失敗するため、取得できません。標準では何も問題がないとされていません。

PUTPATCHDELETE...これらは、POSTよりも具体的なセマンティクスを持つ安全でないメソッドです。それらが適切かどうかは、リソースモデルによって異なります。

覚えておくべき重要なアイデアは、HTTPメソッドはドキュメントドメインに属しているということです( Jim Webberの2011年の講演 を参照)。説明している効果はおそらくドキュメントドメインの一部ではなく、むしろサイドです。ドキュメントが変更されたときに呼び出される効果。これにより、ドキュメントをどのように整理して作業を完了するかについて、多くの自由が与えられます。

0
VoiceOfUnreason