404 状态代码是否适用于插入时不存在的实体?
Is 404 status code suitable for a non existent entity upon insertion?
假设我需要在我的数据库中插入一条记录,该记录具有到另一个实体的外键约束,客户端为其提供了一个不存在的 ID。
显然我检查了提到的外键是否存在。我应该 return 404
状态代码还是 422 - Unprocessable Entity
更合适的响应代码?
根据https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5,404用于以下情况:
- 请求 uri 不匹配
- 服务器不想透露请求被拒绝的原因
- 没有其他回应适用
因此,我会使用 422。
首先要判断是服务器(5xx)错误还是客户端(4xx)错误。你可能会争辩说服务器只做客户端告诉它做的事情,所以这是一个客户端错误,但为什么客户端期望 id 存在呢?服务器有问题吗?是否有较早的错误导致在尝试创建具有缺失 ID 的实体时向客户端发送了错误的 HTTP 状态代码?你能不能捕捉到这样的错误,这样你就不需要处理这种情况,因为它可能不存在?
客户没有在寻找什么,所以我认为 404 不是合适的响应。如果客户端要插入,则永远不会出现 404,因为这是客户端尚未创建的资源的原始状态。
409 是针对与资源状态有关的问题,但问题实际上与另一个资源的状态有关,该资源已丢失。 409 需要 returned 信息以允许调用者解决冲突。如果从服务器收到 409,客户端是否可以创建丢失的 ID?
428 看起来像一个候选者,因为该请求以缺少 id 的存在为条件,但它要求响应包含有关如何解决问题的信息。
实际上是关于服务器如何告诉客户端如何解决问题。如果可以,请选择让服务器执行此操作的最佳 4xx 代码。如果它不能,也许它需要告诉客户端它做了一些它不应该做的事情并且 return 一个 5xx,允许该资源(这对客户端可能很重要)被标记并以不同的方式处理。
假设我需要在我的数据库中插入一条记录,该记录具有到另一个实体的外键约束,客户端为其提供了一个不存在的 ID。
显然我检查了提到的外键是否存在。我应该 return 404
状态代码还是 422 - Unprocessable Entity
更合适的响应代码?
根据https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5,404用于以下情况:
- 请求 uri 不匹配
- 服务器不想透露请求被拒绝的原因
- 没有其他回应适用
因此,我会使用 422。
首先要判断是服务器(5xx)错误还是客户端(4xx)错误。你可能会争辩说服务器只做客户端告诉它做的事情,所以这是一个客户端错误,但为什么客户端期望 id 存在呢?服务器有问题吗?是否有较早的错误导致在尝试创建具有缺失 ID 的实体时向客户端发送了错误的 HTTP 状态代码?你能不能捕捉到这样的错误,这样你就不需要处理这种情况,因为它可能不存在?
客户没有在寻找什么,所以我认为 404 不是合适的响应。如果客户端要插入,则永远不会出现 404,因为这是客户端尚未创建的资源的原始状态。
409 是针对与资源状态有关的问题,但问题实际上与另一个资源的状态有关,该资源已丢失。 409 需要 returned 信息以允许调用者解决冲突。如果从服务器收到 409,客户端是否可以创建丢失的 ID?
428 看起来像一个候选者,因为该请求以缺少 id 的存在为条件,但它要求响应包含有关如何解决问题的信息。
实际上是关于服务器如何告诉客户端如何解决问题。如果可以,请选择让服务器执行此操作的最佳 4xx 代码。如果它不能,也许它需要告诉客户端它做了一些它不应该做的事情并且 return 一个 5xx,允许该资源(这对客户端可能很重要)被标记并以不同的方式处理。