我正在使用REST API,我的票证集合有多种更新方式,因为它将经历多种状态。请注意,其中某些状态只能由特定角色(RBCA)执行。考虑到这一点,最好的方法是什么?
1)使用子方法执行特定操作
匹配/ tickets /:id / validate
PATCH / tickets /:id / update
PATCH / tickets /:id / finish
2)使用单个PATCH / tickets /:id
根据票证的当前状态和用户角色控制要更新的内容在REST最佳实践方面,哪一个是最好的?
答案 0 :(得分:1)
在REST最佳实践方面,哪一个是最好的?
简短答案:选择#2。
更长的答案:我们关心将哪个标识符用作请求目标的原因是HTTP协议中内置了缓存失效语义:如果成功修补了资源,则所涉及的通用组件将驱逐所有该资源的缓存表示。参见RFC 7234中的Invalidation。
因此,如果我们正在实施一个网站,并尝试利用缓存无效化,那么我们可能具有类似
的层次结构# the readable link to a specific tickets collection
/tickets/:id
# a validation form that submits data to /tickets/:id
/tickets/:id/validation
# an update form that submits data to /tickets/:id
/tickets/:id/update
# a finish form that submits data to /tickets/:id
/tickets/:id/finish
所以我们用于“更新”票证集合的工作流程可能看起来像...
GET /tickets/:id
GET /tickets/:id/update
POST /tickets/:id
在不受HTML限制的API中,我们可以考虑使用除POST之外的不安全方法来完成工作。
注意:这确实意味着我们实现中的“ POST / PATCH”端点需要自己做额外的路由才能到达验证/更新/完成逻辑。对于表单,这意味着使用提交的数据来确定预期的行为-可能是隐藏字段,或者端点可能只是根据表单数据中的键进行猜测。