REST - 发送部分无效请求时要抛出的错误

时间:2009-07-06 19:47:01

标签: http rest error-handling

我正在开发一个REST API。为了简化我的问题,我有一个API,允许人们创建一个新的博客帖子。

Blogposts可以存在于类别中,类别由类别ID指定。如果用户提供不存在的category-id,哪个HTTP错误代码最合适?

404 Not Found似乎很糟糕,所以我现在用400 Bad Request。还有更好的吗?

5 个答案:

答案 0 :(得分:8)

我假设您正在回复博客文章资源上的PUT或POST请求。

我会使用400,因为找到了您使用URI访问的资源。如果请求内容正确,可能会修改博客文章。

由于这是发送查询的内容错误而不是资源的实际URI,我会坚持400错误。

但是,如果您要通过PUTting或POSTing到该类别将博客帖子添加到该类别,那么您可以返回404 Not found。

答案 1 :(得分:2)

我同意Vincent,因为在可用的定义状态代码中,400是最好的。客户端应该知道类别ID在提交请求时是否有效,因此会向服务器提供错误的请求内容。

关于提供的其他一些答案:

  • 404 Not Found - 这不是正确使用的状态,因为您实际发送了请求的资源 - 它只是提供的资源中未被找到的引用资源。

  • 406 Not Acceptable - 此状态与Evert评论一样,与Accept标头一起使用;见RFC2616的第10.4.7节:

    请求标识的资源只能生成 具有不可接受的内容特征的响应实体 根据请求中发送的接受标头。

  • 409 Conflict - 此状态适用于冲突的资源状态,通常是由于可能由另一个通道或线程修改资源。 RFC(第10.4.10节)给出了一个例子:

    ...如果正在使用版本控制且实体是PUT 包括对资源的更改与资产的更改 在早期(第三方)请求中,服务器可能会使用409响应 表示无法完成请求

HTTP确实提供了400的替代方案 - 如果适合,您可以为此情况创建自己的4XX状态。在RFC的第6.1.1节中:

  

HTTP状态代码是可扩展的。 HTTP应用程序不需要理解所有已注册状态代码的含义,但这种理解显然是可取的。

因此,您可以定义自己的自定义“430 - 未找到参考资源”或类似内容。如果这个状态是未知的,那么HTTP持久客户端应该将其视为400,但如果客户端专门针对API进行编码,则他们应该能够将其作为430处理并适当地使用它。

答案 2 :(得分:1)

409 Conflict如何违反规则?在这种情况下,博客帖子的类别ID必须已存在。当您返回409冲突回复时,请确定用户可以采取哪些措施来纠正这种情况,以便他们可以重试POST / PUT。

答案 3 :(得分:0)

我认为404 Not Found是最合适的回答 - 考虑到客户端试图访问不存在的类别,所以完美的答案是“我找不到那个类别!”

答案 4 :(得分:0)

404具有非常具体和常用的含义,即无法找到URL。此外,一些浏览器将使用自己的404错误页面,使事情更加混乱。 见http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

我会推荐“406 Not Acceptable

请求标识的资源只能生成响应实体,这些响应实体的内容特征根据请求中发送的接受标头不可接受。“

不过,400还不错。