wcf:rest_REST:管理多对多关系
wcf:rest
介紹
管理多個(gè)資源之間的關(guān)系可能是RESTful API的重要組成部分。 在這篇文章中,我們將看到使用REST API可以管理多對(duì)多關(guān)系。
我們以一個(gè)簡(jiǎn)單的用戶 / 組關(guān)系為例。 假設(shè)用戶和組是兩個(gè)單獨(dú)的資源(例如/ users和/ groups ),并且我們希望提供一種方法來(lái)管理以下幾點(diǎn)所描述的關(guān)系:
- 可以將一個(gè)用戶添加到多個(gè)組
- 一個(gè)組可以包含多個(gè)用戶
- 用戶只能添加一次到組
多對(duì)多關(guān)系可以分為兩種不同的類型:
- 除實(shí)際關(guān)系外,沒(méi)有其他信息的關(guān)系
- 包含其他數(shù)據(jù)的關(guān)系。 在我們的例子中可以像一組成員狀態(tài)(例如, 用戶是在一個(gè)組主持人和一個(gè)簡(jiǎn)單的成員在另一組 )
在本文中,我們將只討論第一種類型的關(guān)系。 與其他數(shù)據(jù)的關(guān)系將在以后的文章中介紹。
當(dāng)然,沒(méi)有單個(gè)正確的解決方案可以解決此問(wèn)題。 下一節(jié)將介紹我獲得最佳經(jīng)驗(yàn)的方法。 之后,我們將介紹一些替代解決方案。
建模子資源和GET操作
首先,我們介紹兩個(gè)子資源:
- / users / <用戶ID> / groups代表分配給ID為<用戶ID>的用戶的組
- / groups / <group-id> / users代表分配給ID為<group-id>的組的用戶
現(xiàn)在,使用GET動(dòng)詞可以請(qǐng)求兩個(gè)集合。
將用戶分配到特定組:
GET /groups/<group-id>/users獲取分配給特定用戶的組:
GET /users/<user-id>/groups添加和刪??除用戶
現(xiàn)在,我們需要一種將用戶添加到組的方法。 我們使用PUT動(dòng)詞執(zhí)行此操作。
將用戶添加到組:
PUT /groups/<group-id>/users/<user-id>此操作不需要請(qǐng)求正文。
例如,這將用戶32添加到組21中 :
PUT /groups/ 21 /users/ 32請(qǐng)注意,在這里我們需要問(wèn)一個(gè)問(wèn)題:是否將用戶添加到組是冪等的。 在我們的示例中,該操作是冪等的:用戶只能添加一次到組中。 因此,我們使用PUT動(dòng)詞。 如果分配操作不是冪等的(例如,可以將一個(gè)用戶多次添加到一個(gè)組中),我們必須使用POST而不是PUT。
在我的其他文章中,您可以閱讀有關(guān)冪等性以及POST和PUT之間的區(qū)別的更多信息。
或者,我們也可以根據(jù)需要從/ users角度對(duì)該操作進(jìn)行建模。
向用戶添加組:
PUT /users/<user-id>/groups/<group-id>要從組中刪除用戶,我們使用DELETE動(dòng)詞。
從組中刪除用戶:
DELETE /groups/<group-id>/users/<user-id>例如,這將用戶32從組21中刪除:
DELETE /groups/ 21 /users/ 32反之亦然,從/ users一側(cè)開(kāi)始:
從用戶刪除組:
DELETE /users/<user-id>/groups/<group-id>請(qǐng)注意,盡管我們?cè)? groups / <group-id> / users / <user-id>上執(zhí)行PUT和DELETE操作,但無(wú)需為此URI實(shí)現(xiàn)GET。 GET / groups / 21 / users / 32只會(huì)返回與GET / users / 32相同的結(jié)果(只要用戶是給定組的一部分)
替代解決方案
引入單獨(dú)的
另一種方法是創(chuàng)建一個(gè)完全獨(dú)立的資源來(lái)管理用戶和組之間的關(guān)系。
將用戶添加到組可能如下所示:
POST /group-members { groupId: 31 , userId: 23 }為了將用戶分配到給定的組 ,我們可以使用與先前解決方案類似的請(qǐng)求:
GET /groups/<group-id>/members但是,這一次它將返回一個(gè)組成員資源列表。
這種方法增加了一些復(fù)雜性(我們添加了一個(gè)可能具有其自身標(biāo)識(shí)符的全新資源)。 但是,如果我們想向關(guān)系中添加一些其他信息(例如, 用戶的加入日期 ),則該功能特別有用。 在以后的文章中,我們將詳細(xì)研究與其他數(shù)據(jù)之間的關(guān)系。
作為正常資源更新的一部分管理關(guān)系
另一種方法是使用標(biāo)準(zhǔn)更新操作來(lái)管理關(guān)系。 例如:
PUT /users/ 23 { "name" : "John" , "groups" : [ { "id" : "42" }, { "id" : "43" } ] }盡管這在某些情況下可以正常工作,但我不推薦這種方法。
資源和關(guān)系經(jīng)常相互獨(dú)立地進(jìn)行更改。 將兩個(gè)操作合并在一起可能會(huì)導(dǎo)致各種問(wèn)題。 例如,從安全角度來(lái)看,兩個(gè)操作可能需要不同的權(quán)限。 客戶端可能被允許將用戶添加到組中,但可能沒(méi)有更新用戶本身的權(quán)限。
由于存在很多關(guān)系,因此這種方法的性能也非常麻煩。 因此,通常最好提供單獨(dú)的操作來(lái)更新資源和關(guān)系。
翻譯自: https://www.javacodegeeks.com/2020/06/rest-managing-many-to-many-relations.html
wcf:rest
總結(jié)
以上是生活随笔為你收集整理的wcf:rest_REST:管理多对多关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: neo4j 迁移_在Kubernetes
- 下一篇: aws dynamodb_AWS Lam