繁体   English   中英

REST Api PUT方法分派

[英]REST Api PUT method dispatch

根据REST设计指南 ,最好将状态更改操作(例如activatepublishshare映射为PUT方法主体作为字段。

像那样:

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

我的问题是如何在后端的put方法处理程序中调度哪个动作是哪个。 我怎么知道它是“激活的”还是“共享的”? 有什么建议么?

@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)

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

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

-- Response

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

“ POST”背后的逻辑是您创建事务对象,而不是修改商品本身。

这是对您的问题以及REST操作和URL API设计注意事项的一个很好的答案

另一个更一般的例子是

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

我认为我们可以将诸如activatepublishshare操作转换为RESTful URL的资源(名词)。

文章激活:

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

供参考:(摘自您在评论中提到的文章链接 :)

那些不适合CRUD操作的操作又如何呢?

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

1.重新构造动作,使其看起来像资源的字段。 如果操作不使用参数,则此方法有效。 例如,激活动作可以映射到布尔激活字段,并通过PATCH更新到资源。

2.使用RESTful原则将其视为子资源。 例如,GitHub的API允许您使用PUT /gists/:id/star标记主意,而使用DELETE /gists/:id/star

3.有时,您确实无法将操作映射到合理的RESTful结构。 例如,将多资源搜索应用于特定资源的端点并没有任何意义。 在这种情况下,/ search即使不是资源,也将是最有意义的。 没关系-只需从API使用者的角度进行正确的操作,并确保已对其进行了清晰记录,以免造成混淆。

我做了类似的事情,只是有些不同,例如

{"do": "activate"}

但也可以按照您的方式来做。

首先,我在完成此任务的模型上创建了一个方法def activate() ,例如将attribute设置为true。 然后在partial_update方法(用于PATCH,用于更新(或放置,取决于您使用的APIViews))中,我检索了以下值:

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

在您的情况下,它会有所不同,因为您只需将参数“ activated”设置为“ true”或“ false”,但仍然需要以下行:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM