Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http REST—发送部分无效的请求时要抛出什么错误_Http_Rest_Error Handling - Fatal编程技术网

Http REST—发送部分无效的请求时要抛出什么错误

Http REST—发送部分无效的请求时要抛出什么错误,http,rest,error-handling,Http,Rest,Error Handling,我正在开发一个RESTAPI。为了简化我的问题,我有一个API,允许人们创建一个新的博客帖子 Blogposts可以存在于类别中,类别由类别id指定。如果用户提供的类别id不存在,哪个HTTP错误代码最合适 404找不到似乎不好,所以我现在用400个不好的请求。有一个更好的吗? < P>我认为没有找到404个是最合适的回应-考虑到客户已经尝试访问一个不存在的类别,所以完美的答案是“我找不到那个类别!” < P>我假设你对你的博客帖子资源中的一个POST或POST请求做出响应。 我会选择400,因

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

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


404找不到似乎不好,所以我现在用400个不好的请求。有一个更好的吗?

< P>我认为没有找到404个是最合适的回应-考虑到客户已经尝试访问一个不存在的类别,所以完美的答案是“我找不到那个类别!”

< P>我假设你对你的博客帖子资源中的一个POST或POST请求做出响应。 我会选择400,因为找到了您使用URI访问的资源。如果请求内容正确,则可以修改博客文章

因为这是错误的已发送查询的内容,而不是资源的实际URI,所以我坚持使用400错误


但是,如果您将博客文章添加到类别中,您可以将其放入或发布到类别中,然后返回404 Not found。

404有一个非常具体且常用的含义,即找不到URL。此外,一些浏览器会使用自己的404错误页面,这会让事情更加混乱。 看

我建议“406不可接受”

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

不过,400也不错。

哪一项违反了特定于应用程序的规则呢?在这种情况下,博客文章的类别ID必须已经存在。当您返回409冲突回复时,请确定用户可以做些什么来纠正这种情况,以便他们可以重试POST/PUT

我同意,在可用的已定义状态代码中,400是最好的。客户机在提交请求时应该知道类别id是否有效,从而向服务器提供错误的请求内容

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

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

  • 406不可接受-此状态与Evert commented一样,与Accept标头一起使用;见第10.4.7节:

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

  • 409冲突-此状态用于资源的冲突状态,通常是由于其他通道或线程对资源进行的修改。(第10.4.10节)给出了一个示例:

    …如果正在使用版本控制并放置实体 包括对资源的更改,这些更改与 在以前的(第三方)请求中,服务器可能会使用409响应 表示它无法完成请求

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

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


因此,您可以定义自己的自定义“430未找到引用的资源”或类似的内容。遵守HTTP的客户端如果不知道该状态,则应将其视为400,但如果客户端专门针对API进行编码,则应能够将其作为430进行处理,并适当地使用它。

这不是对该问题的回答,但如果您的API用于写博客,则最好实现MetaWebLog API()或者Atom发布协议(),所有常用的博客工具都可以发布到它。我自己也肯定会使用Atom,我的服务实际上与博客无关。我只是觉得这是一个很好的例子,这是一个不好的请求,除非你的url类似于
domain.com/category name或id/posts
,并且
category name或id
不存在,这将使404.406直接与Accept-*:headers的使用联系在一起。