REST API - 属于两个不同资源端点的一个操作

时间:2018-02-26 13:26:51

标签: ruby-on-rails rest api restful-architecture

在我应该在API服务器上创建两个不同的资源时,我发现自己太多次了,这些资源是由一个单独的操作启动的。我将其称为跨控制器操作:需要在两个不同控制器中执行逻辑的操作

例如,想象一下使用User模型和Account模型的应用

用户可以与多个帐户相关联。

在我的REST API中,我有一个/accounts/端点和一个/users/端点,它们分别负责AccountUser模型,以及/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控制器中。这对我来说似乎也是错的。

解决此类设计问题的首选方法是什么?

1 个答案:

答案 0 :(得分:0)

考虑添加另一个名为UserAccountMembership的资源。这样做的好处是您可以分担责任:UserAccount资源将保持清洁,同时您将获得一个资源,您可以在其中公开有关资源的具体信息。 "连接"在这两者之间(如链接创建的日期/时间,活动/非活动状态等):

/useraccountmemberships/{useraccountmembershipid} POST, PUT, GET, DELETE

{
    "Id": useraccountmembershipid,
    "UserId": userid,
    "AccountId": accountid,
    "Timestamp": "2018-1-1",
    ...
}

您可能仍希望允许通过父资源访问会员资格,这很好:

/users/{userid}/useraccountmemberships GET
/accounts/{accountid}/useraccountmemberships GET