簡體   English   中英

REST-ish用於多個依賴資源的URI設計

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM