我想使用适用于以下场景的方法设计我的休息端点。
有一个小组。每个小组都有成员。会员必须获得集团管理员的批准才能成为会员。如果管理员拒绝,则用户无法成为该组的成员。
我有以下端点来解决这种情况。
当用户加入群组时
POST /projects/api/v1/projects/{project id}/members/{member id}
批准会员资格
PUT /groups/api/v1/groups/{group id}/members/{member id}/approve
批准会员资格
但是,我无法确定拒绝成员身份的正确端点。 我应该使用
PUT /projects/api/v1/projects/{project id}/members/{member id}/reject
或
DELETE /projects/api/v1/projects/{project id}/members/{member id}
答案 0 :(得分:4)
说穿了,你使用的URI错了。诸如'approve'之类的'actions'不应该是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
字段。
此处的额外好处是,管理员可以将用户的状态设置为“已拒绝”,“已撤销”,“暂停”等,并且没有特别需要发生的事情。虽然您确实需要确保您的服务器验证这些选择,否则您最终会遇到各种各样的愚蠢。您还可以允许管理员直接添加用户,而无需用户首先请求权限。例如,如果管理员想要快速添加某人作为主持人。
答案 1 :(得分:0)
如果您需要更改现有对象资源(也要更改状态),则必须使用PUT
。它会覆盖现有的对象资源并返回200成功状态。建议将POST
用于将数据发送到要处理的服务器。此外,要应用条件行为来选择确切的资源,可以使用If-Match
标头。
找到更好的指南here。
答案 2 :(得分:-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'
}]
}
编辑:当然,拒绝和接受操作链接仅为具有正确权限的用户提供。