![](/img/trans.png)
[英]What is the correct URI design for a REST service with associated resources
[英]REST-ish URI design for multiple dependent resources
我正在嘗試設計一個基於REST-ish的Web服務來與我正在研究的農場動物管理系統進行交互。
為了詳細解釋這個問題,我收集了一個屬於農場的動物 。 每只動物都有自己的信息 - 例如姓名,身份證號碼,品種年齡等。因此,我會假設如下所示的URI適合:
/animals <- retrieve list of animals
/animals/{animal-id} <- Retrieve only one animal
/animals?breed=sheep <- Search/query
當我嘗試將其他依賴資源鏈接到每只動物時,問題就出現了。 動物可以擁有一系列體重信息,以及我所說的評論 (針對特定動物的觀察)。 這些中的每一個都是依賴的,並且只存在於那個特定的動物中,但它們本身就是我想要訪問的資源。
IMO最簡單的方法是將資源嵌套在動物URI中:
/animals/{animal-id}/weights
/animals/{animal-id}/comments
但是,我發現需要直接訪問和查詢權重和注釋 ,而無需引用動物。 使用的例子是從特定品種的所有動物中檢索最近(或所有)的重量...?breed=sheep
甚至返回重量/評論以選擇個體動物ID ...?animals={ID1},{ID2},{...}
。
當我想一次向多個動物添加一條評論時,會出現更多復雜情況。 (請原諒我對POST和JSON的陳述)
POST ....
{
"comment":"Animal moved to paddock B",
"animals":[{id1}, {id2}, ...]
}
我知道這個問題的明顯解決方案是對我想要檢索/編輯的每只動物進行GET和POST(例如)。 我寧願不這樣做,因為最終我希望從移動設備訪問這項服務,因此減少通話次數似乎是明智之舉。
我相信網絡標准允許在URI中使用CSV,所以這樣的東西可以工作,
/animals/{id1},{id2},{..}/weights
但是,我期待一次(或查詢)需要引用十(10)只動物的情況,這將導致一個混亂且不友好的URI。
我目前認為的解決方案是將權重和注釋作為自己的資源公開,這允許我直接訪問和查詢它們
/weights
/weights/{weight-id}
/weights?breed=sheep
甚至直接發布到收藏品
POST /comments
{
"comment":"Animal moved to paddock B",
"animals":[{id1}, {id2}, ...]
}
但是/animals/{animal-id}/weights
返回什么? 它是否需要,或者我只是引用/weights?animal={animal-id}
資源本身的鏈接? 但鏈接到查詢資源是否可以?
我是在制作一個多余的,還是只提供“另一種”方式來訪問信息?
有什么東西我做錯了,我讓我的數據庫影響我的服務模型,還是我完全忽略了這一點?
我對此很陌生,並且已經閱讀了很多關於這些問題的矛盾論點,因此對於什么對我的要求最好是非常困惑的。
謝謝!
如果您想要為其他實體定義頂級資源( /weights
, /comments
等),那么最好為其他實體定義頂級資源。 然后,您可以批量方式POST到這些端點。
POST /comments
{
"animals" : [
{"id" : 1},
{"id" : 2},
{"id" : 3},
{"id" : 4},
],
"commentText" : "Sent to Hamburger Hamlet"
}
請注意,由於多種原因,包括大多數瀏覽器和HTML代理都限制了網址長度(包括大多數瀏覽器和HTML代理都限制了網址長度)(包括大多數經驗法則都是嘗試將網址長度設置為2083個字符或更短)。
我遇到了類似的問題,但最終我們能夠通過使用API為不同的用戶類型提供特定的URL命名空間(可以這么說)來消除您所獲得的復雜性。
例如,它可能是一個農場工人客戶端應用程序,它將執行您正在描述的/權重,/注釋操作(POST,PUT,DELETE等),因此您可以通過以下方式保持其功能清潔:
/farmworkers/comments
/farmworkers/weights
然后仍然將/animals/{animal-id}/weights
URL保留在其他“命名空間”中。
另一件需要考慮的事情是使用HAL格式(http://stateless.co/hal_specification.html)嵌入資源,這可以允許您在請求中嵌入多個動物資源等。希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.