REST Api PUT方法调度

时间:2016-05-20 09:18:54

标签: django api rest django-rest-framework

根据REST design guidelines,最好将状态更改操作(例如activatepublishshare - 映射到PUT方法主体作为字段。

就像那样:

PUT /api/articles/32
{
   "activated": true
}

我的问题是如何在后端调度put方法处理程序中哪个操作是哪个。 我如何知道它是否已被激活"或者是#34;分享"?有什么建议吗?

@detail_route(methods=['PUT'])
def put(self, request, *args, **kwargs):
    # if action == 'activate'
    #    activate()
    # if action == 'publish'
    #    publish()

    return Response(status=status.HTTP_200_OK)

3 个答案:

答案 0 :(得分:1)

我的理解是你想对article执行一些操作。如果您想以纯REST方式执行此操作,则应为每个操作添加某种事务。像这样的东西

POST /api/publish-article-transaction
{
   articleId: 2
}

-- Response

{
  publish_article_transaction: {
    id: 123,
    articleId: 2,
    status: ok
  }
}

'POST'背后的逻辑是你创建一个事务对象,而不是修改文章本身。

这也是你问题的一个很好的答案 REST actions and URL API design considerations

另一个更一般的例子是

POST /api/article-transaction
{
  action: "publish",
  articleId: 2
}

答案 1 :(得分:0)

我认为我们可以将activatepublishshare等操作转换为RESTful网址的资源(名词)。

文章激活:

PUT /api/article-activation/<pk>/ # activate an article

DELETE /api/article-activation/<pk>/ # deactivate an article

文章发布:

PUT /api/article-publication/<pk>/ # publish an article

DELETE /api/article-publication/<pk>/ # unpublish an article

供参考:(摘自您在评论中提到的article link

  

那些不适合CRUD操作世界的行为呢?

     

这是事情变得模糊的地方。有很多方法:

     

1。重新构建操作,使其显示为资源字段。这个   如果操作不采用参数,则有效。例如激活   action可以映射到布尔激活字段并通过a更新   修补资源。

     

2. 将其视为RESTful的子资源   原则。例如,GitHub的API可让您使用PUT /gists/:id/star和使用DELETE /gists/:id/star的unstar加注。

     

3. 有时候你   真的无法将动作映射到合理的RESTful结构。   例如,多资源搜索并不真正有意义   应用于特定资源的端点。在这种情况下,/搜索会   尽管它不是资源,但最有意义。这没关系 - 只是   从API消费者的角度做正确的事情并确保   它被清楚地记录下来以避免混淆。

答案 2 :(得分:0)

我做了类似的事情,只是有点不同,比如

{"do": "activate"}

但也可以按照自己的方式完成。

首先,我在模型上创建了一个方法,它完成了工作def activate(),就像设置属性激活为true一样。然后在partial_update方法中(它用于PATCH,用于放置它的更新(或放置,取决于你使用的是哪个APIView))我检索了这样的值:

action = request.query_params.get('do')
if action == 'activate':
    something.activate()

在你的情况下,它会有一点点不同,因为你只是将参数“激活”设置为“true”或false,但你仍然需要这一行:

activated = request.query_params.get('activated')