使用哪种HTTP方法:PUT或DELETE?
我想用以下方案的适当方法设计我的休息端点。
有一个组。 每个组都有成员。 成员必须经过组管理员批准才能成为成员。 如果管理员拒绝,用户不能成为该组的成员。
我有以下端点来解决这种情况。
当用户加入一个组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}
说穿了,你使用的是错误的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
字段。
在这里增加的好处是,管理员可以将用户的状态设置为“被拒绝”,“被撤销”,“被暂停”等,并且没有什么特别真的需要发生。 虽然你确实需要确保你的服务器正在验证这些选择,否则你最终会遇到各种各样的愚蠢行为。 您还可以允许管理员直接添加用户,而无需用户首先请求权限。 比如管理员想要快速添加某人作为主持人。
如果您需要更改现有对象资源(更改状态),则必须使用PUT
。 它覆盖现有的对象资源并返回200成功状态。 建议使用POST
将数据发送到要处理的服务器。 此外,要应用条件行为来选择确切资源,可以使用If-Match
标题。
在这里找到更好的指南。
我会使用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'
}]
}
编辑:那么当然拒绝和接受行动链接只提供给用户有正确的许可。
链接地址: http://www.djcxy.com/p/41351.html