2012-04-10 25 views
12

我正在設計一個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」才能被更新。

在這種情況下,推薦使用哪種方法?

回答

8

在我看來,你應該保持同樣的結構,GET和PUT請求。爲什麼?因爲將JSON/XML數據映射到對象是很常見的事情,並且如果JSON模式總是相同,那麼執行實際映射的大多數(如果不是全部的話)軟件工作得最好。

所以,你的WebService應接受一個JSON如下代碼:

{ 
    "name":"Joe", 
    "country":{"id":200,"name":"United States of America"}, 
    "likes":[ 
     {"id":5,"name":"Fruit"} 
    ] 
} 

但是它並沒有考慮到這個國家的名字和可能只注重國家ID。

+1

我也完全支持這個觀點。 – 2012-04-10 21:09:06

+0

感謝Crozin和Ferenc。 – 2012-04-11 05:50:39