2013-03-09 81 views
1

我正在尋找一種正確的方式來將搜索表示爲RESTful URI。RESTful URI設計

我有兩個模型:國家和州,其中國家有一個國家集合。

什麼是正確的方式來表示具有ID或名稱屬性的國家搜索?

api/countries/1/id 

api/countries/Italy/name 

api/countries?id=1 

api/countries?name=Italy 

另外,如果我想查看的國家名單中?

api/countries/1/id/states 

api/countries/Italy/name/states 

感謝

回答

1

對於這兩款車型即。 countriesstates,我認爲以下Uri模式將是最合適的。

  1. 所有國家:api/country
  2. 特定國家:api/country/{England}
  3. 所有國家:api/country/{England}/State
  4. 特定狀態:api/country/{England}/State/{Berkshire}
在上面的例子中值

{}代表的變量。

+0

@ user2007820嗨,這是我的想法。現在請回應它,如果您有任何疑問。 – Sachin 2013-03-09 12:44:41

+0

嗨,好的完美...但是,我需要通過id和名字搜索。我如何區分這個要求? – user2007820 2013-03-09 12:56:35

+0

@ user2007820對此,您可以這樣做,只需將'id'後綴添加到像api/countryId/{12}','api/countryId/12/{stateId}'這樣的api。或者你也可以做到這一點,而無需更改網址。爲此,您需要在數據庫的namefiled以及Id字段中搜索參數值。希望你能得到它。請回應:) – Sachin 2013-03-09 13:02:34

0

這取決於你的口味。兩種變體都可以。

各國有可能創造新的端點

api/states/name/Italy 
0

您的方法,在REST URL中使用名稱是錯誤的。這個名字只是國家的一個屬性,而不是一個子資源,這意味着你不應該在URL中看到它。然而,一個選項可以用作密鑰,在這種情況下,名稱的可以用來代替ID。

api/countries/Italy 

我想你想,雖然達到什麼樣的,是過濾領域,即只得到名稱:

api/countries/Italy/states?fields=name 

,或者,如果你預先設置一些格式

api/countries/Italy/states?format=onlyName 
0

代表具有id或name屬性的國家/地區搜索的正確方法是什麼?

tl; dr:變體之一是混淆配方。如果不得不選擇,則使用查詢字符串搜索


至於REST宣言中有關URI的邏輯僅僅是一個實現細節 - 唯一擔心的是,在該位置的訪問機制不能隨着時間的推移打破。內容可能被清空或移動 - 但URI必須始終終結於服務端點,爲客戶端提供他們理解並可以採取行動的預先響應(即3 **重定向或客戶端的超媒體重新發現)。但是,許多成功和精心設計的API試圖揭示一種本質上一致的邏輯,旨在直觀地探索。因此,你的第一個例子api/countries/1/id實際上BAD是關於開發者的經驗和市場的成功,因爲它被混淆使用:

  1. 從看URI,你沒有,你運行的任何線索(許多公共API遵循資源層次結構和公開的URI之間的邏輯映射 - 所以一個共同的預期是api/countries/1/id檢索{1}(作爲毫無意義的查詢),或者是那些無意義的查詢api/countries/1/name給出{Italy}

因此,查詢字符串是一個很好的選擇 - 尤其是提供了一個搜索功能。人們可以從詞語看到的含意;)

api/countries?name=Italy 
api/countries?q=name(Ital*)    // same result 
api/countries?q=isoCode=(IT)    // same result 

--> api/countries/1/states    // list all states of Italy 
    api/states?q=country/name(Italy)  // - same - 
    api/states?q=country/id(1)   // - same - 

請求的響應主體可從看只有URI,這是很好的可以預期的。更好的是:它有助於分辨資源和觀點。在查詢字符串中定義「視圖」,將其視爲鏡頭或過濾器,通過它查看否則是同一個資源(您的國家/地區集合)的摘錄。

這種模式只是在那些方面的好,通常也發現:

api/countries/search/Italy 
api/countries/search/name=Italy 
api/countries/search/isoCode=IT,name=*aly 

之所以挑這個構建API時,各地實際實施細節可以旋轉 - 因爲它的方式隔開給資源的直接訪問從搜索操作 - 滿足請求所需的CPU /內存以及響應計數和格式可能會有根本的不同。