2015-12-17 30 views
0

我需要構建一個用於獲取對象的寧靜網址,它與典型的/ objectService/objectId有點不同。其他網址獲取GET的最佳做法

考慮我有一個「水果服務」,我的服務可以在三張不同的桌子上,一張蘋果桌子,一張香蕉桌子和一張橙色桌子上做GET。所有的獲取返回一個水果對象。

這是一個可以接受的寧靜模式?

/fruitService/apple/123 
/fruitService/orange/456 

服務沒有返回蘋果或橘子對象,它返回「果」的對象,所以我不知道,如果它是確定有蘋果/ 123當123是一種水果的ID,而不是蘋果對象。

我想這將是最好過

/fruitservice/123?type=apple 

有沒有更好的辦法?

由於提前, 金

+0

如果您發現我的回答有用,請立即/接受它。 – Opal

回答

0

根據我與Ruby on Rails的(這是沒有太大的)經驗

/fruitService /橙/ 456

應返回橘子對象來自ID = 456的桔子表。 這幾乎是軌道上的最佳做法。 在我看來它更好,看起來更合乎邏輯。如果您針對水果運行查詢,則這將是一個合適的URL。

/fruitService /水果/ 456

這將刪除從您的API很多歧義。

0

就個人而言,它會創建一個Fruits表,該表具有Apple和Orange以及香蕉表/實體/ ID的ID和引用。最重要的是,從Fruits表ID將因此暴露給消費者簡單而優雅的端點可用於:

/fruits/{FID}/ 

得到一個特定的水果。這樣可以避免將細節和模型暴露給消費者。

編輯

如果您沒有訪問DB因此結構不能改變我會去以下端點:

/fruits/orange/{ID}/ 

等。在REST中使用這樣的端點是非常普遍的做法 - 我的意思是使用共同的根(水果)之後不是ID而是其他描述符(桔子)。例如。 /food/categories//food/products/

使用上述端點明確指出了哪些可用類型,並使用戶更容易獲得他們更快需要的內容。

該解決方案的缺點是違反了開閉原則。對於每個新表,都需要添加新的端點。

爲了避免增加新的端點可以用查詢參數去:

/fruits/{FID}/?view=orange 

但是你需要清楚地說明什麼是可用視圖選項。

+0

這是我喜歡做的事情,無論如何,我無法控制數據庫結構,我只能訪問它。 – KimK

+0

返回水果的格式是什麼?全部都一樣? – Opal

+0

是的,同樣的對象被返回,我只需要通過請求進行通信的方式是從哪個表獲取項目。我已經讀過,你應該只將參數放在搜索URL上,所以不想做/ fruits/id?type = apple – KimK