使用哪种HTTP方法:PUT或DELETE?

时间:2014-06-15 07:16:54

标签: rest http http-delete http-method http-put

我想使用适用于以下场景的方法设计我的休息端点。

有一个小组。每个小组都有成员。会员必须获得集团管理员的批准才能成为会员。如果管理员拒绝,则用户无法成为该组的成员。

我有以下端点来解决这种情况。

  1. 当用户加入群组时 POST /projects/api/v1/projects/{project id}/members/{member id}

  2. 批准会员资格 PUT /groups/api/v1/groups/{group id}/members/{member id}/approve批准会员资格

  3. 但是,我无法确定拒绝成员身份的正确端点。 我应该使用

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

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

3 个答案:

答案 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 People!

当然,如果使用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'
        }]
}

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