2011-09-02 67 views
2
/competitions/1/clubs/5/players 
/players/search?club_id=5 
/players?club_id=5 

什麼時候應該爲資源使用一流的URL,何時應該使用嵌套的URL?哪個URL描述資源最好?

更新1

感謝迄今答案。我會盡量澄清一些事情。

比賽和俱樂部有多對多的關係。俱樂部可以參加多項比賽。我想這將讓俱樂部第一類實體,所以訪問一個俱樂部的方式是例如:

/clubs/33 

但我也需要能夠訪問參與特定比賽的俱樂部,所以我需要類似這樣的東西:

/competitions/2/clubs 

但有人提到它不建議通過多個URI來訪問資源。這不違反嗎?

而且,我相信這樣的URI不會是可取:

/competitions/2/clubs/33/players/5 

而要用這樣的:

/clubs/33/players/5 

俱樂部與球員一到一對多的關係。

+0

看起來第一個URL應該是'/ clubs/5/players'對稱。 – 2011-09-02 19:51:29

+0

我改變了這個問題,因爲沒有或多或少的RESTful URI。 –

+0

我更新了我的帖子。 – Rits

回答

0

如果關係「感覺」樹/目錄明智(如俱樂部有玩家/clubs/berlin/players),我使用路徑元素。參數是更多的「標籤」,我經常用它來搜索過濾器(例如,年齡更老的「柏林」俱樂部的防守隊員,比如22 /clubs/berlin/players?position=defender&age=22)。

我按'域重要性'設計URL結構。最基本的概念應該是根源。如果可能的話,不要在url-structure下面深入,我儘量不要複製或創建代表相同資源的別名集合(在代碼+文檔中花費雙倍維護)。

一般把/俱樂部爲根感覺更自然:/clubs/{club_id}/players

我只能通過/competitions/{comp_id}/clubs/{club_id}/players暴露的玩家,如果玩家設定的是/clubs/{club_id}/players,例如不同在比賽中 有幾名球員被禁賽或沒有參加比賽。

你是什麼意思與​​?這是比賽還是單場比賽?如果與兩個俱樂部單場比賽可能使用主場+客場概念:/competitions/{comp_id}/home-club/competitions/{comp_id}/away-club

更新1回答

這裏我對您的更新問題的思考:

我猜/competitions/2/clubs/clubs一個子集,不是每個俱樂部在每一個比賽的競爭。所以這兩個資源是不同的,所以兩個URL是好的。

再次思考/competitions/2/clubs/33/players/5也應該沒問題(但重要的是在服務器代碼中避免重複)。當返回的資源是/clubs/33/players的子集時(例如,玩家受傷或者團隊規模受到特定競爭的限制),該URL甚至應該是強制性的。

1
/competitions/1/clubs/5/players 

作爲一個URI是一個單一的資源的標識,我會說,一般的規則是,如果它是一個對象,它獲得了「一流的URL」。

我只傾向於在限制/過濾列表時使用查詢參數,例如/competitions/1/clubs/5/players?gender=MALE

+0

+1對不需要的東西使用查詢參數。 –

+0

路徑段用於識別可自然分層組織的資源。查詢參數適用於其他任何事情。 –

+0

@達雷爾我不是遵循OP給出的例子如何不是分層的。鑑於我們知道的信息有限,我認爲這是因爲他們需要屬於特定俱樂部的球員列表,因此它適合於獲得俱樂部以及該俱樂部的球員('/ clubs/5/players')。如果是我,那麼這個資源就是玩家的URI列表('/ players/1','/ players/2'等)。如果該球員資源表示包含他們所屬的俱樂部/俱樂部的信息,那麼我同意查詢球員將同樣有效('/ players?club = 5')。 –

0

我不會把ID號碼放在URL中。他們的意思只是爲了那些真正瞭解他們的意思的人,但對於其他人來說,他們是無意義的數字。

您應該始終爲您的網址選擇描述性和相關詞語,因爲該網址有助於提供有關鏈接資源的信息。

而不是使用無意義的ID號,選擇代表隊或賽事之名的唯一名稱,例如

/competitions/worldcup/clubs/usa/players 

但如果你真的需要發送那種匿名數據的URL,那麼我寧願在查詢中看到它們。

僅爲URL使用有意義的文本。