2013-04-25 46 views
2

我想了解更多有關REST方法的信息:)。比方說,我有一個ProductTypes集合,可以通過url GET/productTypes進行檢索,並假設我們可以但不必應用任何篩選器。所以這會獲取500條記錄。REST:集合子集部分更新的最佳實踐

現在,如果我想完全更新資源,我可以在/ productTypes/123上使用PUT或POST。到現在爲止還挺好。

如果我創建一個新的資源,我事先知道的ID,我會用在PUT/productTypes/123,並返回201,否則用於更新200

PUT如果我做的部分更新資源我會在/ productTypes/123/displayOrder上執行PUT或POST,並返回303表示某些其他資源已被修改。

但是,如果我在1個POST基本上發送產品ID和顯示順序的Key-Value對列表,並且我修改了500條記錄中的5條,該怎麼辦?我現在如何表明這5條記錄已經改變?

在此部分更新之後,GET at/productTypes會發生什麼情況。我在某處讀到,我不應該用這個get返回多個記錄,而是應該返回列表鏈接到資源,然後一個接一個地讀取它們,因爲這會允許瘋狂的緩存。但是,我仍然如何表明5條記錄已經改變?我需要用303做5個獨立的帖子,還是有不同的機制。希望這是有道理的。

+0

有沒有,你是不是考慮到鏈接到5個修改的資源返回JSON什麼特別的原因?如果POST請求可能對最終用戶有用,則可能會返回一個對象或列表。 – 2013-04-25 19:03:43

回答

0

我沒有在規範中看到任何明確禁止您使用多個Content-Location標頭的內容。我測試了一下,Chrome完全可以。它不會自動爲您重定向,但您不希望涉及多個資源。

HTTP/1.1 303 See Other 
Content-Location: /productTypes/123/displayOrder 
Content-Location: /productTypes/456/displayOrder 
Content-Location: /productTypes/789/displayOrder 
Content-Location: /productTypes/012/displayOrder 
Content-Location: /productTypes/345/displayOrder 
0

我應該這樣做:

PATCH /productTypes HTTP/1.1 
Content-Type: application/json 

{"item":[ 
    {"id":"1","displayOrder":"4"}, 
    {"id":"2","displayOrder":"2"}, 
    {"id":"3","displayOrder":"1"}, 
    {"id":"4","displayOrder":"3"}, 
    {"id":"5","displayOrder":"5"} 
]} 


HTTP/1.1 200 OK 
Content-Type: application/hal+json 

{ 
    "_links": { "self": {"href": "/productTypes" } } 
    "_embedded": { 
    "item": [{ 
     "_links": { "self": { "href": "/productTypes/1" } }, 
     "displayOrder": "4" 
    }, 
    /* 4 more entries */ 
    ] 
    } 
}