2017-09-14 48 views
1

RFC 6902定義了很多事情和清楚。但有兩個相關的東西:HTTP PATCH一個連接表?

  1. 你如何修補已加入到資源的表?
  2. 而當連接有多行?

例如,

GET /news/123 

[ 
    {"title": "Hello", "contents": "World", "categories": [1, 2, 3]} 
] 

凡結果來自這些數據庫表和列:

title = news.title 
contents = news.contents 
categories = newscategories_mapping WHERE newscategories_mapping.newsID = news.id 

所以,如果我發送一個補丁:

PATCH /news/123 
[ 
    {"op": "replace", "path": "/title", "value": "New Title"} 
] 

這是非常簡單的。但是,當我想更新同一資源的類別時如何? IE瀏覽器。 「加入」表。

PATCH /news/123 
[ 
    {"op": "replace", "path": "/categories", "value": [4, 5]} 
] 

此外,通知兩兩件事:

  • 現有值,沒有包含。
  • 量小於原始(2值,而不是3)

假設貼片之前的原始值是newscategories_mapping.id 20,21和22

問題1:如若新的/categories4替換id = 20,值5替換id = 21?或者應該刪除id = 20,id = 21和id = 22,並且新值得到新ID id = 23和id = 24?

問題2:應刪除id = 22,即使沒有明確要求?

問題3:還是應該完全沒有完成上述任務,而是我應該有一個單獨的端點來修補每個類別?所以,例如。 PATCH /news/123/categories/20PATCH /news/123/categories/21

回答

0

您可以將多個JSON修補程序段添加到您的請求中。所有步驟都可以應用,或者根本沒有應用,但在交易中應用它們!

PATCH /news/123 
[ 
    {"op": "replace", "path": "/title", "value": "New Title"}, 
    {"op": "replace", "path": "/categories", "value": [4, 5]} 
] 

問題1:如果新的/類別值4更換ID = 20,和值5取代的id = 21?或者應該刪除id = 20,id = 21和id = 22,並且新值得到新ID id = 23和id = 24?

RFC美國明確地The "replace" operation replaces the value at the target location with a new value.因此應用補丁後的值應該是4和5。你基本上與在修補程序操作給出的列表替換現有列表。

問題2:應刪除id = 22,即使沒有明確要求?

問題3:還是應該上面根本無法完成,我應該不是有修補每個類別的單獨的終結點?所以,例如。 PATCH/news/123/categories/20和PATCH/news/123/categories/21?

補丁是由服務器執行到目標資源轉化爲預期結果,客戶端計算的簡單說明。如果你想包括22在categories元素的最終狀態,你有兩個選擇:

  • 你在replace操作發送到您要設置
  • 添加列表中值添加舊值額外的add操作在其他人被刪除後明確添加所需值

客戶端應始終在發送修補程序請求之前從服務器檢索最新狀態。通常這些修改應該應用於最近的狀態,因此ETag頭部被用來利用樂觀鎖定並防止過時狀態的更新。

+0

好吧,所以基本上它沒關係的API **你如何產生的價值,例如。 ''[1,2,3]'',這大部分是我所掌握的。因此,您只需向端點添加單獨的處理,以檢查數據庫中要更新的內容。所以如果使用''「path」:「/ categories」',我需要添加一些映射,使其更新'newscategories_mapping'而不是'news''。基本上是部分PUT,沒有什麼奇怪的。 –