这基本上是最佳实践问题。在我的Rest API(我目前正在处理)中,我在PUT
等网址上提供了匹配DELETE
和/resources/{resourceID}
请求的路由。 API的背后是SQL DB。
通常,对SQL数据库中不存在的资源ID执行DELETE
或UPDATE
查询不会产生错误,只有affectedRows
返回0。
现在我对如何正确执行此类请求有疑问:
UPDATE
或DELETE
之前(涉及其他SQL查询)UPDATE
/ DELETE
查询而不检查是否存在并检查SQL查询的结果并在HTTP 404
时返回affectedRows == 0
?我个人更喜欢后者。但我可以想到其他DBMS(不是SQL或非关系型),执行INSERT
,UPDATE
或DELETE
查询可能不会返回有关受影响行的任何信息。如何处理这种情况?
答案 0 :(得分:1)
作为API的用户,我希望获得HTTP 404
一个不存在的资源,而不依赖于使用的HTTP方法。
当我真的想删除/users/ted
时,我试图删除/users/tod
可能是个大问题。没有404
我会假设一切正常,我想删除的用户实际上已被删除。实际上,我删除了一个不存在的用户。
答案 1 :(得分:1)
使用资源ID执行DELETE
和UPDATE
操作后,我看不到检查受影响行数的任何问题。这应该足以检查您的资源是否存在。
基本上:
DELETE
或UPDATE
。答案 2 :(得分:0)
在更新服务中,如果资源不在那里,我会返回201 (CREATED)
,您希望自己的服务能够容忍,否则返回{{1}如果您希望您的客户严格遵守您的协议。
如果删除,您可以返回404
如果客户端尝试删除不存在的资源,或者如果您跟踪已删除的资源(某些服务执行此操作,则只会标记'已删除' a资源,例如为了让客户端有机会撤消操作)您可以返回404
告诉客户端资源已被删除。
如果DBMS没有提供有关受影响行的线索,您可以在执行操作之前查询资源(无论是插入,更新还是删除)。这有点过分,但如果这是在采取行动之前了解资源状态的唯一方法,并且您不期待性能问题,那么这可能是一个可行的解决方案