在我应该在API服务器上创建两个不同的资源时,我发现自己太多次了,这些资源是由一个单独的操作启动的。我将其称为跨控制器操作:需要在两个不同控制器中执行逻辑的操作
例如,想象一下使用User
模型和Account
模型的应用
用户可以与多个帐户相关联。
在我的REST API中,我有一个/accounts/
端点和一个/users/
端点,它们分别负责Account
和User
模型,以及/accounts/:account_id/users
端点用于这两个模型之间的关联
因此,如果用户选择取消与帐户的关联,我会提出此类请求:HTTP DELETE /accounts/:account_id/users/:id
当用户严谨地POST /users/
注册以创建新用户时
用户还可以选择注册并直接与帐户关联(例如,通过特殊邀请)。在这种情况下,我必须注册一个用户并创建一个与被邀请的帐户的关联,最好是在对服务器的单个请求中这样做。
我知道我可以向/users/
请求创建用户,然后向/accounts/1/users/1
发送另一个请求以创建用户和帐户之间的链接,但这样做只是为了坚持REST原则似乎是多余的。
另一种选择是创建一个不同的动作,例如register_from_invitation
,它将处理这两个动作,但问题就在于它应该处于什么位置。在AccountUsers控制器中,在Users控制器或Accounts控制器中。这对我来说似乎也是错的。
解决此类设计问题的首选方法是什么?
答案 0 :(得分:0)
考虑添加另一个名为UserAccountMembership
的资源。这样做的好处是您可以分担责任:User
和Account
资源将保持清洁,同时您将获得一个资源,您可以在其中公开有关资源的具体信息。 "连接"在这两者之间(如链接创建的日期/时间,活动/非活动状态等):
/useraccountmemberships/{useraccountmembershipid} POST, PUT, GET, DELETE
{
"Id": useraccountmembershipid,
"UserId": userid,
"AccountId": accountid,
"Timestamp": "2018-1-1",
...
}
您可能仍希望允许通过父资源访问会员资格,这很好:
/users/{userid}/useraccountmemberships GET
/accounts/{accountid}/useraccountmemberships GET