我有一个带条件操作的资源:
/foos/{id}/authorize /foos/{id}/cancel
这个想法是授权会将资源的状态从保存(默认)更改为授权(由第三方应用程序).授权可以从远程部分返回错误或者可以被授权.一旦授权,资源就无法再次被授权,因此这不是可以一次又一次调用的动作.
撤消授权资源时会发生取消.一旦取消,资源将永久保留.
考虑到此操作不安全并且不能被视为幂等因为第二次调用会返回"资源已被取消"这样的错误并且同时我不创建这种操作的RESTful世界中正确的动词是什么一个新资源,只是在已知资源中进行状态更改?
我会用
DELETE /authorization/1234
关于DELETE对以前删除的资源的幂等性存在争议.请参阅https://evertpot.com/idempotence-in-http/和https://leedavis81.github.io/is-a-http-delete-requests-idempotent/
这里的底线是,在一个总有一个结果的数学世界中,幂等性是有意义的,但在HTTP中你会得到两个不同的结果 - 服务器的响应和资源的新状态.很难确定什么是幂等的,什么不是幂等的.
在HTTP规范不明确的领域,我推荐了parmatmatism而不是教条主义.
如果你真的想客户知道他们是否删除该资源或自己,如果别人没有的话,我看不出有什么问题,在以前删除的资源响应404.
如果您不关心,或者认为它永远不会发生(因为没有足够的并发访问或者因为所有客户端总是在发送DELETE之前都会进行GET时刻),所以在所有情况下都可以愉快地坚持204.