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

abe*_*ger 10 api rest put http-delete

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

Viv*_*ath 11

语义DELETE意味着你实际上已经摆脱了对象.你在这里做的事情似乎是对象状态的修改.在这种情况下,PUT或者PATCH更合适.

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

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

  • 值得补充的是:如果使用软删除删除技术,`DELETE`仍然合适。 (2认同)
  • 我同意@ChristoKiwi 的观点。许多应用程序不会物理删除数据库中的任何记录,而是将“IsDeleted”列(或类似列)标记为“1”。因此,国家历史的全部历史都被保留下来。 (2认同)

Lan*_*Lan 5

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


Nic*_*nks 5

如果您发送请求的 URL 上的资源DELETE在该 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
Run Code Online (Sandbox Code Playgroud)

这不是:

GET /friends/bob => 200 OK {"status"="friend"}
DELETE /friends/bob => 204 No Content
GET /friends/bob => 200 OK {"status"="formerfriend"}
Run Code Online (Sandbox Code Playgroud)

类似的事情最好用PUTor处理PATCH

GET /friends/bob => 200 OK {"status"="friend"}
PATCH /friends/bob {"status"="formerfriend"} => 204 No Content
GET /friends/bob => 200 OK {"status"="formerfriend"}
Run Code Online (Sandbox Code Playgroud)