使用哪种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

    上一篇: Which HTTP method to use: PUT or DELETE?

    下一篇: Handling CRUD on child objects with RESTful