是否可以使用HTTP DELETE来取消激活记录?

时间:2013-03-04 16:13:06

标签: api rest put http-delete

我正在构建一个RESTful API命令来停用用户记录。是否使用DELETE来执行此操作或是否应该是PUT,因为记录正在更新为“已停用”状态?或者仅仅是品味问题?

3 个答案:

答案 0 :(得分:10)

DELETE的语义意味着你实际上正在摆脱这个对象。你在这里做的事情似乎是对象状态的修改。在这种情况下,PUTPATCH会更合适。

最好坚持使用您正在使用的统一接口的语义(在本例中为HTTP动词)。如果这些与您在应用中实际执行的操作相匹配,则可以减少混淆。另外,如果您稍后决定DELETE应该实际删除记录而不是仅将其标记为“非活动”,该怎么办?现在,您已经更改了API的行为。此外,如果您使用的是DELETE,那么您基本上遵循“最少惊喜原则”,这对API很有用。最好让DELETE实际删除,而不是假装这样做。

另一方面,如果事实证明您需要保留数据以用于历史目的,那么从一个位置移除记录并将其移动到其他地方(例如,从一个表到另一个表)是完全没问题的。在这种情况下,该记录应该对将来的操作保持不可用(即,资源上的GET应该返回404)。

答案 1 :(得分:4)

如果在停用操作之后,最终用户无法再通过“GET”访问该资源,除非再次重新激活,我看不到使用“DELETE”的问题。否则,“PUT”更合适。

答案 2 :(得分:3)

如果您发送DELETE请求的网址上的资源不再可用于该URI,则DELETE是合适的。如果它仍然在那里但是改变状态,那么它就不是。

e.g。这没关系(/ friends / bob的资源消失;在此过程中在/ formerfriends / bob创建了一个新资源,但这是偶然的):

GET /friends/bob => 200 OK
GET /formerfriends/bob => 404 Not Found
DELETE /friends/bob => 204 No Content
GET /friends/bob => 410 Gone
GET /formerfriends/bob => 200 OK

这不是:

GET /friends/bob => 200 OK {"status"="friend"}
DELETE /friends/bob => 204 No Content
GET /friends/bob => 200 OK {"status"="formerfriend"}
使用PUTPATCH

可以更好地处理类似的事情
GET /friends/bob => 200 OK {"status"="friend"}
PATCH /friends/bob {"status"="formerfriend"} => 204 No Content
GET /friends/bob => 200 OK {"status"="formerfriend"}