我正在为 CRUD 应用程序设计 REST API。资源 ID 是数据库在插入时生成的 UUID。所以当我进行 PUT 操作时,我们可以这样说
PUT http://host/books/{database generated UUID}
体内的数据和
{database generated UUID}
不存在,正确的行为是什么?
我不能只用这个 UUID 创建资源,因为 UUID 是由数据库分配的。 我不能只使用新的自动生成的 UUID 创建资源,因为这样 PUT 就不再是幂等的,因为每个后续的 PUT 都会使用新的自动生成的 UUID 创建一个新的相同资源。
那么RESTful如何处理这种情况呢?返回 404? 400? 422?还有别的吗?
403(禁止)状态代码表示服务器理解该请求但拒绝执行它。
与所有客户端错误响应一样,解释问题性质以及如何解决问题的详细信息将复制到响应正文中(表示“错误情况的解释”)
假设,您只需完成这项工作(生成正确的数据库生成的 ID),然后将客户端重定向到正确的资源(301 永久移动或308 永久重定向)。
毕竟,它们是您的资源,您可以随时创建/删除/更新它们。
潜在的棘手之处是通用 HTTP 客户端是否会被响应混淆。
如果您走这条路,您的代码更改应该附带描述您所做的研究、可用的替代方案、涉及的权衡等的文档(也称为“架构决策记录”或一些合理的等效项)。
如果您的分析告诉您,采用这种方法的好处很小,那么您可能应该倾向于做更正常的事情并返回客户端错误。