1

I want to design my rest endpoint with the appropriate method for the following scenario.

There is a group. Each group has members. A member has to be approved by the group admin in order to become a member. If the admin rejects, the user cannot become a member of the group.

I have the following endpoints to address this scenario.

  1. When a user joins a group POST /projects/api/v1/projects/{project id}/members/{member id}

  2. For approving membership PUT /groups/api/v1/groups/{group id}/members/{member id}/approve to approve membership

However, I am having trouble deciding the right endpoint for rejecting membership. Should I use

PUT   /projects/api/v1/projects/{project id}/members/{member id}/reject

or

DELETE  /projects/api/v1/projects/{project id}/members/{member id}
4

3 回答 3

5

坦率地说,您使用的 URI 是错误的。诸如“批准”之类的“操作”不应成为 URI 的一部分。

多个列表

我想这样做的一种“明显”方式是让一个小组同时列出已批准的成员和等待被接受的成员。如果用户想被添加,他可能会POST /groups/{group id}/waitlist/{user id}. 这使得管理员很容易拒绝,他们只需DELETE /groups/{group id}/wait_list/{user id}. 如果管理员希望批准,他可以POST /groups/{group id}/users/{user id}

现在,您可能会在此处看到的问题之一是,我们知道该用户同时在“已批准用户”列表和“正在等待批准的用户”列表中。根据您管理此用户列表的确切方式,这可能不是问题。但是,如果您希望用户只出现在这些列表之一中,则必须在批准后将其从等待列表中删除。

乍一看很简单。我想到了两个选项,一个是当您批准用户时,通过将它们添加到“用户”列表中,服务器也将它们从“等待列表”中删除。这有点肮脏,POST 并不意味着有这样的副作用。所以真的,我们需要客户端(管理员)发出第二个请求。

补丁人!

当然,如果使用 PATCH 方法,这一切都会变得容易得多。一个组可以有一个用户列表,与他们在该组中的状态配对。当您想被添加到组中时,您可以发出类似的请求PATCH /group/{group id}/users/ {'user id': 666, 'status':'request access'}。当管理员批准/拒绝时,他们会提出几乎相同的请求,只是更新该status字段。

这里的额外好处是,管理员可以将用户的状态设置为“拒绝”、“撤销”、“暂停”等,并且没有什么特别需要发生的事情。尽管您确实需要确保您的服务器正在验证这些选择,否则您最终会遇到各种愚蠢的情况。您还可以允许管理员直接添加用户,而无需用户先请求权限。例如,如果管理员想快速将某人添加为版主。

于 2014-06-15T20:25:05.807 回答
0

如果您需要更改现有对象资源(也更改状态),则必须使用PUT. 它覆盖现有的对象资源并返回 200 成功状态。POST建议将数据发送到服务器进行处理。此外,要应用条件行为来选择确切的资源,可以使用If-Match标头。

在这里找到更好的指南。

于 2014-06-15T12:41:09.293 回答
-1

我会使用 POST。然后,您可以将该成员置于该组的拒绝状态。否则,我想如果资源被删除,该成员可能会一次又一次地重新申请。

为了显示:

POST   /projects/api/v1/projects/1/members

201, CREATED

{
    id: 1234
    member: 'Tom'
    status: 'pending'
    links: [{
            rel:  'self',
            method: 'GET',
            href: '/projects/api/v1/projects/1/members/1234'
        },{
            rel:  'member',
            method: 'GET',
            href: '/projects/api/v1/members/4321'
        },{
            rel:  'reject',
            method: 'POST',
            href: '/projects/api/v1/projects/1/members/1234/reject'
        },{
            rel:  'accept',
            method: 'POST',
            href: '/projects/api/v1/projects/1/members/1234/accept'
        }]
}


POST   /projects/api/v1/projects/1/members/1234/reject

204: No Content


GET   /projects/api/v1/projects/1/members/1234

200, OK

{
    id: 1234
    member: 'Tom'
    status: 'rejected'
    links: [{
            rel:  'self',
            method: 'GET',
            href: '/projects/api/v1/projects/1/members/1234'
        },{
            rel:  'member',
            method: 'GET',
            href: '/projects/api/v1/members/4321'
        },{
            rel:  'appeal',
            method: 'POST',
            href: '/projects/api/v1/projects/1/members/1234/appeal'
        }]
}

编辑:当然,拒绝和接受操作链接只提供给具有正确权限的用户。

于 2014-06-15T12:01:47.313 回答