3 回答

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

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
我會(huì)將這種關(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
如你所見(jiàn),我沒(méi)有使用POST將球員放到球隊(duì),而是PUT,它可以更好地處理球員和球隊(duì)的n:n關(guān)系。
添加回答
舉報(bào)