![](/img/trans.png)
[英]In django rest framework, put method is not working (Dropdown) api/root
[英]REST Api PUT method dispatch
根据REST设计指南 ,最好将状态更改操作(例如activate
, publish
, share
映射为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
}
我认为我们可以将诸如activate
, publish
或share
操作转换为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.