我正在研究REST API,并且我的门票集合有多种更新的方式,因为它会经过多个状态。请注意,其中一些状态只能由特定角色(RBCA)执行。考虑到这一点,最好的方法是什么?
1)使用子方法进行特定动作
补丁/门票/:ID/validate
补丁/售票/:ID/UPDATE
补丁/门票/:ID/饰面
2)根据票证的当前状态和用户角色来控制更新的内容,并使用单个补丁/票证/:ID
当涉及其余的最佳实践时,哪一个是最好的?
当涉及其余的最佳实践时,哪一个是最好的?
简短答案:选择#2。
更长的答案:我们关心哪个标识符被用作请求的目标的原因是,HTTP具有缓存无效的语义:如果您成功修补了资源,那么所涉及的通用组件就会知道驱逐所有的所有内容缓存该资源的表示。请参阅RFC 7234中的无效。
因此,如果我们正在实施一个网站,并试图利用缓存无效,我们可能会有一个层次结构,例如
# 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/patch"。实施中的终点需要自行进行其他路由,以达到验证/更新/完成逻辑。使用表格,这意味着使用提交的数据来确定哪种行为的意图 - 也许是一个隐藏的字段,或者终点只是基于键在表单数据中的键进行猜测。