【问题标题】:Responding appropriately with a 415 error in a RESTful web app正确响应 RESTful Web 应用程序中的 415 错误
【发布时间】:2012-10-27 18:35:20
【问题描述】:

我正在构建一个 Web 应用程序,它可以通过 PUTPOSTPATCHx-www-form-urlencoded 和 JSON 格式接受资源表示。如果我收到另一种格式的请求正文,我想发送一个415 响应,以及一些声明我接受哪些格式的附加数据(以类似于405 响应的强制性Allow: 标头的方式)。我在HTTP 406 and 415 error codes 的一个回答中看到,回答的人不知道是否定义了这样的机制,RFC 2616 在这方面没有提及任何内容,一些粗略的谷歌搜索也没有出现。

我想只使用Accept:,即使它被定义为请求标头。将其重新用于此响应似乎是最合适的。人家同意吗?谁有更好的建议?

编辑:我后来找到了Specify supported media types when sending "415 unsupported media type",它专门询问是否有这方面的标准。正确且被接受的答案基本上是no,但那里的受访者也和我有同样的想法,即 Accept 将是一个很好的标题,可以用来提供这些信息。这提示 a messageJulian Reschke 到 HTTP 工作组询问是否应该定义在响应中发送 Accept: 标头应该意味着什么。那封电子邮件只收到了一封回复,他们同意它是必要的,并且接受似乎是合适的。

请注意,我不是在询问我是否允许发送 Accept 标头,任何标头都可以向任一方向发送,但只有规范中定义的标头具有 含义(语义)到中介,而且,任何不以 X- 为前缀的意外标头都可能与 HTTP 的未来版本发生冲突。这不打扰我。

【问题讨论】:

  • 我所有未解决的问题仍在等待可接受的答案。我很想看到发布给他们的新答案。
  • 那么也许您应该提出可以以可接受的方式回答的问题。

标签: rest http


【解决方案1】:

正如你所说,Accept 是一个请求标头。在响应中使用它是错误

quote Wikipedia

内容协商是 HTTP 规范中定义的一种机制,它可以在同一个 URI 上提供文档的不同版本(或更一般地说,资源表示),以便用户代理可以指定哪个版本适合他们的能力最好的。

所以 client 在请求中说他可以Accept 的媒体类型。如果服务器无法提供这种媒体类型,他会回复406 Not Acceptable

由于客户端必须能够处理所请求资源的返回表示,它应该指定它可以理解的媒体类型。它可以指定多种媒体类型:

Accept: application/json, application/xml, x-www-form-urlencoded

如果客户端真的想接受任何媒体类型,可以设置

Accept: */*

即使是这样的请求,服务器也会设置一个正确的Content-Type响应头。

【讨论】:

  • “所以是客户端在请求中说明他可以接受哪些媒体类型。如果服务器无法提供这种媒体类型,他会以 415 Unsupported Media Type 响应。” - 但问题是 服务器 如何响应它不理解给定的Content-Type
  • 服务器通过将状态设置为 415 来执行此操作。您想要的是服务器告诉它可以理解什么。在 HTTP 中没有办法做到这一点。
  • @Tichodroma 不,@CodeCaster 正在纠正您回答中的错误。您说“如果服务器无法传递此媒体类型,他会以415 Unsupported Media Type 进行响应。” 如果服务器无法满足 Accept 请求标头的条件,则应改为发送 406 Not Acceptable。在我描述的情况下,415 响应是正确的。
  • @Nicholas Right,已编辑。我的回答的重点仍然是Accept 不是 由服务器设置。
【解决方案2】:

您收到无法识别的 Content-Type 很可能来自当前正在为您的服务实现客户端的开发人员。由于不存在服务器宣传其支持的内容类型的机制,您不妨在消息正文中提及您支持哪些类型。

【讨论】:

    【解决方案3】:

    我不知道执行此操作的任何标准机制,但您可以稍微重新调整 Alternates 标头 http://www.ietf.org/rfc/rfc2295.txt 的用途来做您想做的事情。

    【讨论】:

    • 我不明白它是如何工作的。 Alternates 提供其他表示的 URI。我正在寻找一种方法来告诉客户它的请求正文应该采用什么格式。如果要进一步解释您的想法,请扩展您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2010-11-24
    • 2012-01-25
    • 2012-07-26
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多