Rest API UPDATE / DELETE - 检查资源是否存在?

时间:2016-03-21 14:40:44

标签: api rest

这基本上是最佳实践问题。在我的Rest API(我目前正在处理)中,我在PUT等网址上提供了匹配DELETE/resources/{resourceID}请求的路由。 API的背后是SQL DB。

通常,对SQL数据库中不存在的资源ID执行DELETEUPDATE查询不会产生错误,只有affectedRows返回0。

现在我对如何正确执行此类请求有疑问:

  1. 检查具有给定ID的资源是否存在于UPDATEDELETE之前(涉及其他SQL查询)
  2. 触发UPDATE / DELETE查询而不检查是否存在并检查SQL查询的结果并在HTTP 404时返回affectedRows == 0
  3. 我个人更喜欢后者。但我可以想到其他DBMS(不是SQL或非关系型),执行INSERTUPDATEDELETE查询可能不会返回有关受影响行的任何信息。如何处理这种情况?

3 个答案:

答案 0 :(得分:1)

作为API的用户,我希望获得HTTP 404一个不存在的资源,而不依赖于使用的HTTP方法。

当我真的想删除/users/ted时,我试图删除/users/tod可能是个大问题。没有404我会假设一切正常,我想删除的用户实际上已被删除。实际上,我删除了一个不存在的用户。

答案 1 :(得分:1)

使用资源ID执行DELETEUPDATE操作后,我看不到检查受影响行数的任何问题。这应该足以检查您的资源是否存在。

基本上:

  • 对于可以检查受影响的行的数据库,只需执行DELETEUPDATE
  • 对于此功能不可用的数据库,请先执行查询。

答案 2 :(得分:0)

在更新服务中,如果资源不在那里,我会返回201 (CREATED),您希望自己的服务能够容忍,否则返回{{1}如果您希望您的客户严格遵守您的协议。 如果删除,您可以返回404如果客户端尝试删除不存在的资源,或者如果您跟踪已删除的资源(某些服务执行此操作,则只会标记'已删除' a资源,例如为了让客户端有机会撤消操作)您可以返回404告诉客户端资源已被删除。 如果DBMS没有提供有关受影响行的线索,您可以在执行操作之前查询资源(无论是插入,更新还是删除)。这有点过分,但如果这是在采取行动之前了解资源状态的唯一方法,并且您不期待性能问题,那么这可能是一个可行的解决方案