2012-03-28 7 views
4

基本的なCRUD操作のURLを構造化する方法についてたくさんの例を見てきましたが、コマンドに似た操作やアプリケーションサービスの呼び出しについてはほとんど見ていません。アプリケーションサービス呼び出しのRESTful URL規則を修正しましたか?

たとえば、アプリケーションサービスでRemoveOldOrders(int customerId)のように、idが "customerId"の顧客の注文が2歳以上のシステムから削除されたとします。私の安らかなサービスのURLはどのように見えますか?コールのペイロードはどのように見えますか?どのようなHTTPメソッド(POST?)を使用しますか? (得意先がURLから来るように)POSTなど

/顧客/ 1/RemoveOldOrders、空のボディを持つ:

私の考えでは、それはこのようなものになるだろうです。

このようなガイドラインはありますか?

更新:重複する可能性のある投稿についてのコメントの代わりに私の質問を明確にする必要があるように感じます(はい、その投稿は本質的に同じことを求めていますが、 )。

リソースに対して操作を実行したいが、その操作が標準HTTP動詞に適合しない場合はどうすればよいですか?

もう1つの例:私のアプリケーションはESBに接続されており、処理のためにリソースをESBに強制的に投影する方法が必要ですか?

ExportCustomer(int customerId) 

は今、RESTfulなサービスの場合には、どのように私は、URIでこのアクションを表すことができます:私の現在のSOAPベースのWebサービスでは私のような方法があるだろうか?

POST http://someapp/api/customer/1/export 

かになります:ブライアン・ケリーの答えからオプション1のようなもの、最も論理的なように思える

POST http://someapi/api/customer/export/1 

は良いかも?

+0

重複する可能性があります質問:http://stackoverflow.com/questions/6850187/non-crud-operations-in-a-restful-service – smcg

答えて

2

"remove"のような動詞をモデル化したいときはいつでも、DELETEと考えるべきです。同様に、「作成」はPOST(または/または多分PUT)と考える。GETとし、「更新」はPUT(または多分PATCH)と考える。

「古い注文を削除する」の例では、間違いなくDELETEを使用する必要があります。あなたの残っている唯一の挑戦は、削除すべき注文を特定する方法です。一度それを理解すると、URIスキームがそれに該当します。

はここにいくつかのオプションがあります:

  1. DELETE http://your-api.com/old-orders

    ここで、old-ordersの意味および範囲は、この要求を受信するサーバによって決定されます。これにより、クライアントはその必要がなくなりますが、その範囲を変更する能力はなくなります。

  2. GET http://your-api.com/order-query?days-older-than=730

    これは、古い予定のセットを表しhttp://your-api.com/order-query-result/{some ID}Location URIを返します。そのURIにDELETEを発行するだけで、古いレコードをパージすることができます。

  3. 代わりに、このタイプの削除コマンドを発行することを忘れないようにクライアントを強制的に、purgeRecordsOlderThanDays=730のようないくつかのフィールドを設定するためにあなたのAPI経由で操作することができるconfigurationリソースのいくつかの種類を提供し、ちょうどサーバがあなたのために自動的にそれをやらせますcronのような形でそれが私の好ましいアプローチだろう。エクスポートするための

+0

「動詞」が「削除」に該当しない場合、 「作成」、「更新」、または一般的なHTTPアクションの1つですか?私は貧弱な例を使用しました。私は、私の営業担当者のコメントとして、それを「リソース」と考えて説明しているが、それは多くの状況では当てはまりません。私のリソースが依然として顧客であるが、操作が「ESBにエクスポート」のように非常に鈍い場合はどうでしょうか? –

+2

次に動詞の名詞を作成することで、それが問題を引き起こしていると考えて、その代わりに行動してください。たとえば、 "ESBにエクスポート"をモデル化するには、実際のエクスポートを実行するために 'POST 'できる' ESBExporter'リソースが必要です。 –

0

、あなたは「輸出」動詞を削除し、リソースのESB表現と交換する必要があります: -

  • GET http://someapp/customer/{id}
  • 応答は、輸出へのリンクが含まれています。 GET http://someapp/customer/{id}/ESB
  • エクスポートリンクを取得すると、適切なコンテンツタイプのESB表現が返されます。
0

たとえば、 (ID:customerId)の顧客の RemoveOldOrders(int customerId)のように、2歳以上のシステム から注文を削除するコールがあるとします。 安心してご利用いただけるようにURLはどのように見えますか? コールのペイロードはどのように見えますか?どのようなHTTPメソッド(POST?)を使用しますか?

RemoveOldOrders(int customerId) 
DELETE /oldOrders {customerId: id} 
DELETE /customer/{id}/orders?old=true 
etc... 

あなたはuniform interface/resource identifiersHTTP method specificationについての詳細をお読みください。

URLは重要ではありません。リソースにリソース識別子(URL)を持たせ、HTTPメソッドの呼び出しのように統一された(標準)インターフェイスを使用してリソースを操作する必要があることは重要です。

関連する問題