web-dev-qa-db-ja.com

コマンドを送信するRESTfulな方法

RESTfulサーバーに「コマンド」を送信するにはどうすればよいですか?

使用例:サーバーは特定の情報をキャッシュするため、その情報が要求されるたびにデータベースを読み取る必要はありません。クライアントアプリケーションからコマンドを送信して、サーバーにキャッシュをフラッシュするように指示する方法が必要です。 「.../flush_cache」などのURLでPOSTまたはPUTを使用しますか?

転送される状態がコマンドの結果でない限り、「コマンド」は実際には「表現状態の転送」を必要とするデータではありません。「スイッチがオフ」、「キャッシュがフラッシュされる」などです。一般的なルールとして、 RESTコマンドをサーバーに送信しますか?

53
Ralph

私は過去のプロジェクトでそのような状況に多く遭遇しました。 RESTはリソースに関しては...なので、本当にRPCの性質のものに対処する方法は必ずしも明確ではありません。

これを回避する簡単な方法は、それを残りの官僚的部分と考えることです。要求はリソース自体にすることができます。

1。 "私のサーバーでコマンドをトリガーしたいですか?最初にこのフォームI90292に入力して送信してください":

POST /bureaucracy/command-request 
Content-Type: application/x-www-form-urlencoded
Content-Length: ...
  1. 「わかりました。できることを確認します。ケース番号は999です。」

    201作成済み(または202クーゲルのコメントに従って承認済み)場所/ bureaucracy/command-request/999

  2. そしてクライアントは定期的にチェックします

    GET/bureaucracy/command-request/999

うまくいけば、彼は次のような応答を受け取ります

200 OK
<command-request>
  <number>999</number>
  ...
  <result>Success</result>
</command-request>

もちろん、官僚的なサービスが優れた顧客ケアを持っている場合、顧客が望めばそれが終わったときに顧客に電話するように勧めます:
「私たちのサーバーでコマンドをトリガーしますか?親切にこのフォームに記入して送信してください。連絡先情報に参加して、完了時に電話をかけることができます」

POST /bureaucracy/command-request?callback=client.com/bureaucracy/inbox 

またはカスタムhttpヘッダーとしてX-Callback: http://client.com/bureaucracy/inbox

70
redben

私はこれをお勧めします:

  • POSTこのコマンドに副作用がある場合は、HTMLフォームと同様に、コマンドを送信する方法をクライアントに通知するGETできるリソースを作成します。
  • リソースにPOSTしてコマンドをトリガーし、このPOSTリクエストの実行中に作成した新しいリソースにURIを返します(例:http://server.example/results/00001)、おそらく204(コンテンツなし)ステータスとLocationヘッダーまたはリダイレクト(どのクライアントが理解できるかによる)。
  • クライアントに、GETを使用してこのリソースの結果を確認させます。 POST直前に返されたエンティティとして、このリソース(または同様の何か)の表現を返すこともできます。

結果リソースのライフサイクルを決めるのはあなた次第です。結果を長期間保存する必要がない場合は、短命になる可能性があります。たとえば、URIはUUIDから構築できます。

15
Bruno

あなたの場合、cacheをリソースにしてみませんか?

DELETE /cache

フラッシュしたいとき。

POST /cache

新しいものを作成したいとき。

または、前の2つを次のように組み合わせます。

DELETE /cache?autorecreate=true
5
Martin Konecny