2016-06-09 58 views
6

PATCH方法應該返回響應正文中資源的所有字段嗎?
還是應該只返回更新的字段?
PATCH方法應該返回響應正文中資源的所有字段嗎?

我讀this

例如,如果只返回更新的字段,用戶可以知道哪些字段是在服務器上更新,而用戶更新某些字段。

**Users resource representations** 
name: string 
age: number 
createdon: date 
modifiedon: date 


PATCH /users/{userId} 
Request body 
{ 
    name: 'changedname', 
} 


Response body Case1 
{ 
    name: 'changedname', 
    age: 20, 
    createdon: 2016-01-01, 
    modifiedon: 2016-06-09 
} 


Response body Case2 
{ 
    name: 'changedname', 
    modifiedon: 2016-06-09 
} 

回答

3

通常這應該通過content negotiation來處理。換句話說,客戶要求有特定的表示,如果它需要的話。該請求是這樣的:

PATCH /user/123 
Content-Type: application/merge-patch+json 
Accept: application/vnd.company.user+json 
... 

在這種情況下,客戶表示,它希望全user表示作爲答案。或者它可以這樣做:

PATCH /user/123 
Content-Type: application/merge-patch+json 
Accept: application/vnd.company.object-fragment+json 
... 

要求一些對象的通用片段表示。

如果你不想這樣做,你不需要同時實現這兩種情況,在這種情況下,你只是做你的用例,並用406 Not Acceptable來回應,media-types你暫時不支持。

0

我不認爲RES T規範(順便說一句,我認爲你需要看看RFC 6902這個)強制執行任何強有力的規則(你應該返回)。我寧願返回整個資源,以便客戶端可以以任何需要的方式使用它。理論上,客戶端自己知道什麼是補丁(至少是什麼請求)。從服務器獲得確認可能不是微不足道的(特別是考慮到PATCH主要用於集合),或者至少不值得。

+0

在RFC 5789第2.1節中有一個定義:https://tools.ietf.org/html/rfc5789#section-2.1 –

+0

儘管它好奇地說它是一個文檔,但沒有別的。 ''成功PATCH應對現有文本文件: HTTP/1.1 204無內容 內容位置:/file.txt 的ETag: 「e0023aa4f」'' –

+0

然而,它也說:''注意 其他成功代碼也可以使用.''(除了204) –