16

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

4

3 回答 3

18

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

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

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

于 2013-03-04T16:15:38.033 回答
7

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

于 2013-03-04T16:18:54.140 回答
4

如果您向其发送DELETE请求的 URL 上的资源在该 URI 上不再可用,那么DELETE是合适的。如果它仍然存在但改变了状态,那么它不是。

例如,这没关系(/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"}

PUT使用or可以更好地处理类似的事情PATCH

GET /friends/bob => 200 OK {"status"="friend"}
PATCH /friends/bob {"status"="formerfriend"} => 204 No Content
GET /friends/bob => 200 OK {"status"="formerfriend"}
于 2013-04-05T19:41:23.650 回答