2016-03-21 113 views
1

这基本上是最佳实践的问题。在我Rest API(我目前正在使用的)中,我有路由匹配PUTDELETE请求的网址,例如/resources/{resourceID}。 API的后面是SQL DB。Rest API更新/删除 - 检查资源是否存在?

一般情况下,执行在SQL数据库上不存在的资源ID DELETEUPDATE查询没有给出错误,只有affectedRows返回0

现在我对如何正确地执行这样的请求一个问题:

  1. 检查是否与给定的ID的资源是否存在之前UPDATEDELETE(其涉及额外的SQL查询)
  2. 触发UPDATE/DELETE无覆盖查询ut检查是否存在并检查SQL查询的结果,并在affectedRows == 0的情况下返回HTTP 404

我个人比较喜欢后者。但是我可以想到其他DBMS(不是SQL或不关联)执行INSERT,UPDATEDELETE查询可能不会返回任何有关受影响行的信息。如何在这种情况下进行?

+1

看看这里:https://github.com/for-GET/http-decision-diagram –

回答

1

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

基本上:

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

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

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

+0

这是显而易见的。我更感兴趣的是考虑是否执行额外的查询以查明资源是否存在或在对不存在的资源执行DELETE/UPDATE之后依赖于数据库引擎的结果......以及如何在数据库引擎不处理时处理此问题在这种情况下提供任何有用的结果... – shadyyx

+0

所以你的问题不是关于标签API或休息,但更多的数据库相关。正如其他人指出的那样,您应该尽可能多地使用数据库的可能性。如果不支持,请先删除它,然后再选择该行。 –

0

在更新服务我回到201 (CREATED)的情况下,资源是不存在的,你想你的服务是“宽容”,如果你希望你的客户必须严格遵守的协议,否则返回404。 在删除的情况下,如果客户端试图删除不存在的资源,或者如果您跟踪已删除的资源(某些服务执行该操作,它们只是标记'已删除'的资源,例如为了给客户端撤消操作的机会),您可以返回409 (CONFLICT)以通知客户端资源已被删除。 如果DBMS没有提供有关受影响行的线索,则可以在执行操作(无论是插入,更新还是删除)之前查询资源。这有点矫枉过正,但如果这是在对其采取行动之前了解资源状态的唯一方法,并且您不希望出现性能问题,那么这可能是一个可行的解决方案。