2017-08-23 11 views
1

私は2つの種類のリソース、店舗と品目を持っています。店舗はそのIDによって一意に識別できます。店舗にはいくつかの異なる種類の品目が含まれています。例えば、モデルAの導体ケーブルは265のコードを有し、コード265のアイテムは複数の店舗に存在することができる。 サンプルHTTP要求とその応答。私が持っていると思い何REST複数のリソースの部分的な更新

GET /stores/1/items 
    [{ 
    "itemCode": 265, 
    "itemDescription": "Conductor cable", 
    "itemModel": "model1", 
    "uom":"meter", 
    "quantity": 30 
    }, 
    { 
    "itemCode": 122, 
    "itemDescription": "Low-fat Milk", 
    "itemModel": "model2", 
    "uom":"liter", 
    "quantity": 15 
    }] 
GET /stores/2/items 
    [{ 
    "itemCode": 265, 
    "itemDescription": "Conductor cable", 
    "itemModel": "model1", 
    "uom":"meter", 
    "quantity": 25 
    }] 


GET /stores/3/items 
    [{ 
    "itemCode": 122, 
    "itemDescription": "Low-fat Milk", 
    "itemModel": "model2", 
    "uom":"liter", 
    "quantity": 20 
    }] 

は、APIの消費者の動きを聞かせREST APIエンドポイントである、MODEL1の導体ケーブルの10メートルは、私が持つの選択肢が存在しているはずストア1からストア2 に言いますストア1と2の数量を更新してこれを達成するための2つのPATCH HTTPリクエストですが、これを単一のHTTPリクエストで実現する必要があります。

+0

[PATCH](副作用がある可能性があります)(https://tools.ietf.org/html/rfc5789#section-2)複数のリソースを一度に変更できるため、1回のリクエストで複数のリソースを変更できます –

答えて

0

PATCHは本当に安らかです。私はRESTだけでこれを解決できる方法は見当たりません。なぜなら、これは一般的に単一のリソースを扱うためです。

私が見る唯一の真のRESTfulな方法は、各モデルのリソースを作成することです(おそらくこれを行う必要があります)。そのモデルから、それが属するコレクションを変更します(collectionリレーションタイプ)。

あなたの例ではリンクが表示されないので、真のRESTfulなアプローチを実際には探していないと仮定しています。この場合、私はカスタムPOSTリクエストがおそらく十分に良いと言います。

+0

なぜ'PATCH'はRESTfulではないはずですか? RESTfulにならないためにはどのような制約が違反ですか?実際にはRESTを提案した[Roy Fielding(https://twitter.com/fielding/status/275471320685367296)の提案もされました。 –

+0

私はつぶやきのスレッドはあなたが知る必要があることだと思います。私が読んでいないことを読んでいますか? PATCHは効果的にリソースを変更するための一連の命令を送信しています。状態を転送しません。 – Evert

+0

これに関して、 'POST'は、セマンティクスが実装者によって定義されていて、あなたが望むものを基本的に送ることができるので、RESTfulではなく、aまたは複数のリソースの状態に影響するかもしれません。 RESTはすべてリソースに関するものですが、特定の状態になるようにリソースを変更する方法を指示する指示をサービスに送信すると問題ありません。また、更新されたコレクション全体を送信しなければならないので、効率がはるかに低いものの、「PUT」を介して更新することで状態遷移を達成することもできます。どちらの場合でも送信するデータの負荷以外の実際の違いは何ですか? –

1

HTTP PATCHを使用してこれを実現したい場合は、JSON Patch - RFC 6902が役立ちます。 1回のリクエストで複数の操作を送信できるので、複数のリソースとプロパティを同時に更新することができます。いずれかの操作が失敗した場合、パッチ全体も失敗するはずです。ただし、リクエストの中でアイテムの新しい最終数量を指定する必要があります。現在の値から減算する操作を定義することはできません。したがって、このソリューションがマルチユーザー環境で動作するためには、楽観的なロック機構が必須です。それ以外の場合、データ破損が発生する可能性があります。

HTTP POSTは良い選択肢です。ある店舗からある店舗にいくらかの商品を移動することは、銀行口座間でお金を振り替えることに似ています。この場合、次のエンドポイントの作成を検討します。POST /stores/item-transferリクエスト本体には、ソースstore/itemCode/itemQuantityとターゲットストアが含まれます。すべての状態変更は、単一のトランザクション内で発生します。

個人的に私はPOSTアプローチに賛成ですが、PATCHに固執してJavaがあなたの言語ならば、Tomokoライブラリを使用してRFC 6902要求を処理することをお勧めします。私はその作者です。

関連する問題