根据REST design guidelines,最好将状态更改操作(例如activate
,publish
,share
- 映射到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)
答案 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)
我认为我们可以将activate
,publish
或share
等操作转换为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')