3 回答

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個贊
制作一組單獨(dú)的/memberships/
資源。
如果沒有別的話,REST就是要制作可進(jìn)化的系統(tǒng)。此時,您可能只關(guān)心某個玩家是否在某個特定團(tuán)隊(duì)中,但在將來的某個時刻,您會希望用更多數(shù)據(jù)來注釋該關(guān)系:他們在該團(tuán)隊(duì)中待了多長時間,誰引用了他們對那個團(tuán)隊(duì),他們的教練是誰/當(dāng)時在那個團(tuán)隊(duì)等等。
REST依賴于緩存效率,這需要考慮緩存原子性和失效。如果您將新實(shí)體POST到
/teams/3/players/
該列表將失效,但您不希望備用URL/players/5/teams/
保持緩存狀態(tài)。是的,不同的緩存將包含不同年齡的每個列表的副本,并且我們無法做很多事情,但我們至少可以通過限制我們需要使實(shí)體無效的實(shí)體數(shù)量來最小化用戶POST更新的混淆在他們的客戶端的本地緩存中唯一一個在/memberships/98745
(見“交替指數(shù)”的埃蘭的討論生命超越分布式事務(wù)的更詳細(xì)的討論)。您可以通過簡單地選擇
/players/5/teams
或/teams/3/players
(但不是兩者)來實(shí)現(xiàn)上述2點(diǎn)。讓我們假設(shè)前者。但是,在某些時候,您需要保留當(dāng)前成員資格/players/5/teams/
的列表,并且能夠在某處引用過去的成員資格。讓超鏈接到列表中的資源,然后你可以添加當(dāng)你喜歡,而不必打破大家的書簽為個人會員資源。這是一般概念; 我相信你可以想象其他類似的期貨更適用于你的具體情況。/players/5/memberships/
/memberships/{id}/
/players/5/past_memberships/

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個贊
我會將這種關(guān)系映射到子資源,一般設(shè)計(jì)/遍歷將是:
# team resource/teams/{teamId}# players resource/players/{playerId}# teams/players subresource/teams/{teamId}/players/{playerId}
在Restful-terms中,它有很多不用考慮SQL和連接,而是更多地考慮集合,子集合和遍歷。
一些例子:
# getting player 3 who is on team 1# or simply checking whether player 3 is on that team (200 vs. 404)GET /teams/1/players/3# getting player 3 who is also on team 3GET /teams/3/players/3# adding player 3 also to team 2PUT /teams/2/players/3# getting all teams of player 3GET /players/3/teams# withdraw player 3 from team 1 (appeared drunk before match)DELETE /teams/1/players/3# team 1 found a replacement, who is not registered in league yetPOST /players# from payload you get back the id, now place it officially to team 1PUT /teams/1/players/44
如你所見,我沒有使用POST將球員放到球隊(duì),而是PUT,它可以更好地處理球員和球隊(duì)的n:n關(guān)系。
添加回答
舉報(bào)