我正在設計一個REST API,並正在尋找推薦的用於更新對象圖的最佳實踐。我的問題是在一個例子可以很好地說明,所以讓我們說,我有一個GET資源,如下所示:用於更新對象圖的REST API設計
URI:/人/ 123
這個URI返回一個對象圖是這樣的:
{
"name":"Johnny",
"country":{"id":100,"name":"Canada"},
"likes":[
{"id":5,"name":"Fruit"},
{"id":100,"name":"Sports"}
]
}
當允許API消費者更新此資源時,您如何期望通過PUT或PATCH更新對象?更新「名稱」屬性非常簡單,但我不確定「國家」或「喜歡」,因爲消費者只能將關係更改爲其他對象,而不能創建新的對象。
這裏是請求更新的一種方法:
{
"name":"Bob",
"countryId":200
"likeIds":[3,10,22]
}
此更新將資源更改爲以下:
{
"name":"Bob",
"country":{"id":200,"name":"United States of America"},
"likes":[
{"id":3,"name":"Cars"},
{"id":10,"name":"Planes"},
{"id":22,"name":"Real Estate"}
]
}
這樣的設計明確且清楚地要求消費者只更新「 ID「,但我擔心PUT/PATCH的對象圖看起來與GET不同,這使得API很難學習和記憶。因此,另一種選擇是請求PUT/PATCH如下:
{
"name":"Bob",
"country":{"id":100},
"likes":[
{"id":3},
{"id":10},
{"id":22}
]
}
這將產生相同的變化,因爲以前的更新,並不會改變對象圖。但是,它並沒有向API消費者明確說明只有「ID」才能被更新。
在這種情況下,推薦使用哪種方法?
我也完全支持這個觀點。 – 2012-04-10 21:09:06
感謝Crozin和Ferenc。 – 2012-04-11 05:50:39