我有一个带有条件操作的资源:
/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 规范不明确的领域,我建议实用主义而不是教条主义。
如果您确实希望客户端知道是他们自己删除了资源还是其他人删除了资源,那么我认为对先前删除的资源响应 404 没有问题。
如果你不在乎,或者认为它永远不会发生(要么因为没有足够的并发访问,要么因为所有客户端总是在发送 DELETE 之前执行 GET),你可以愉快地坚持使用 204所有案例。
关于rest - 正确的 RESTful 动词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34394914/