2017-08-23 61 views
1

我有兩種資源,商店和商品,商店可以通過它的ID唯一標識,商店包含許多不同類型的商品。商品具有代碼以通常標識它們的類型例如,modelA的導體電纜的代碼爲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 
    }] 

我想有什麼是REST API端點,將讓該API消費者的舉動,說從商店110米MODEL1的導體電纜的存儲2. 我知道存在具有的選項兩個PATCH HTTP請求通過更新存儲區1和2中的數量來實現此目的,但我需要通過一個HTTP請求來實現此目的。

+0

'PATCH' [可以有副作用](https://tools.ietf.org/html/rfc5789#section-2)並一次修改多個資源,因此您可以用一個請求修改多個資源 –

回答

0

PATCH是不是真的很寧靜。我沒有看到REST獨自解決這個問題,因爲它通常只處理單個資源。

我看到的唯一真正的RESTful方式是爲每個模型創建資源(您應該可能會這樣做),並從該模型中更改它屬於哪個集合(collection關係類型)。

我沒有在您的示例中看到任何鏈接,所以我假設您並不真正尋找真正的RESTful方法。在這種情況下,我會說在這裏自定義的POST請求可能已經足夠了。

+0

爲什麼應該'PATCH'不是RESTful?它違反了什麼約束以避免RESTful?甚至是[由Roy Fielding提議](https://twitter.com/fielding/status/275471320685367296),他們實際上也提出了REST。 –

+0

我認爲,所有你需要知道的推文線程。你在讀什麼我不是在讀書嗎? PATCH有效地發送一組修改資源的指令。它不轉移狀態。 – Evert

+0

在這方面'POST'不是RESTful,因爲語義是由實現者定義的,你可以基本上發送你想要的任何東西,它可能會或可能不會影響一個或多個資源的狀態。雖然REST是關於資源的,但是如果您向服務發送指示,那麼它會告訴它如何修改資源以產生特定狀態,這很好。你也可以通過'PUT'來更新狀態轉換,儘管效率低得多,因爲你必須發送整個更新的集合。那麼除了兩種情況下發送的數據的負載之外,這裏的實際差別是什麼? –

1

如果你想用HTTP PATCH實現這個,那麼JSON Patch - RFC 6902應該會有幫助。它允許在單個請求中發送多個操作,因此可以同時更新多個資源和屬性。如果任何操作失敗,那麼整個修補程序也會失敗。但是,在一個請求中,你必須指定一個項目的新的最終數量。您無法定義要從當前值中減去的操作。所以爲了讓這個解決方案在多用戶環境中工作,樂觀鎖定機制是必須的。否則數據損壞必然會發生。

HTTP POST是一個很好的選擇。將一定數量的物品從一家商店轉移到另一家商店就類似於銀行賬戶之間的轉賬。在這種情況下,我會考慮創建以下端點:POST /stores/item-transfer。請求主體將包含源存儲/ itemCode/itemQuantity和目標存儲。所有狀態修改都會在單個事務中發生。

就我個人而言,我支持POST方法,但是如果你堅持PATCH和Java是你的語言,那麼我建議使用Tomoko庫來處理RFC 6902請求。我是它的作者。