如何正确发送406状态代码?

时间:2010-12-12 17:43:02

标签: web-services rest http-headers http-status-codes

我正在开发一个RESTful API服务,最初只接受JSON格式的响应。我想遵循标准,如果请求者的接受标题与JSON不同,我想用406 HTTP状态代码响应,通知请求者我不能以其他格式输出数据。

根据W3“应该包含一个实体,其中包含可用实体特征和位置的列表,用户或用户代理可以从中选择最合适的”我的回答。

我该怎么做,因为上面的解释并没有告诉我多少。提到的实体是什么?

有任何想法/建议吗?


修改

最初我认为也许可能是 Content-Type 标题中的逗号分隔列表,但重新思考后我可能会做同样的事情浏览器并使用接受标题?这实际上更有意义,但我找不到任何支持这一点的信息。

1 个答案:

答案 0 :(得分:3)

这里有三个问题:

首先,来自RFC 2616的注释旨在解决URI方案,其中不同类型的响应在各种URI处可用,例如“/path/to/thing.xml”vs“/path/to/thing.json ”。这并不总是一个受欢迎的选择,但是如果你能做到这一点,那么这样做并在“实体”中包含每个超链接的超链接;也就是说,在回应的主体中。由于RFC没有为此类链接强制使用内容类型或处理模型,因此您可以自行决定如何返回这些链接,但带有<a>标记的HTML很常见且有用。

如果您不想在单独的URI上公开多个类型,但只想在原始URI上公开一种类型,那么用406和一个简单说明资源可以发出的类型的实体进行响应就完全没问题了。

其次,请注意大多数Web浏览器在Accept标头中发送*/*(质量值较低),该标头应与任何Content-Type匹配。此外,规范说“......如果不存在Accept头字段,则假定客户端接受所有媒体类型。”所以你应该筹集406的情况很少见。

第三,不要发出Content-Type响应头,它不是响应实体的Content-Type。 应该用于列出可接受的类型。你还应该发出一个名为'Accept'的响应头; 'Accept'标题仅用于请求;见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1