2010-12-12 54 views
1

我正在开发一个RESTful API服务,最初只会接受和响应JSON格式。我想遵循标准,并在请求者的情况下接受标题不同于JSON我想用406 HTTP状态代码进行响应以通知请求者我无法以其他格式输出数据。如何正确发送406状态码?

根据W3“应该包括含有可用的实体特征和位置(S),用户从该用户或代理可以选择一个最合适的列表的实体”在我的响应

我该怎么做,因为上面的解释没有告诉我很多。什么是实体

任何意见/建议?


编辑

起初我想,也许可以在内容类型头一个逗号分隔的列表,但也许重新考虑后,我应该做同样的事情浏览器做的,使用接受头?这实际上更有意义,但我找不到任何信息来支持这一点。

回答

3

三个问题在这里:

首先,从2616音符旨在解决URI方案,其中不同类型的反应是由可在不同的URI的,如“/path/to/thing.xml”与“/path/to/thing.json”。这并不总是一个流行的选择,但如果你能做到这一点,那就这样做,并在每个“实体”中包含超链接。也就是在答复的主体中。由于RFC没有为这些链接指定内容类型或处理模型,因此您应该如何返回它们,但带有<a>标签的HTML是常见且有用的。

如果您不想在单独的URI处公开多个类型,但只想在原始URI处公开一个类型,那么使用406和一个只说明资源可以发出哪些类型的实体。其次,请注意,大多数网页浏览器在接受标头中发送*/*(其质量较低),应该与任何内容类型相匹配。另外,规范说“如果不存在Accept头字段,则假定客户端接受所有媒体类型。”所以你应该提高406的情况很少见。

第三,不要发出除响应实体的内容类型以外的内容类型响应头。应该使用而不是来列出可接受的类型。您还应该而不是发出一个名为'Accept'的响应标题; “接受”标题仅用于请求;请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1

+1

+1个人而言,我将使用text/plain作为406的返回内容类型,并包含一些文本,如'此服务仅提供应用程序/ json' – 2010-12-17 00:39:33

+0

@fumachu我不希望类型为在URI中,我想通过Accept和Content-Type头部“正确地”完成它(尽管它可能有点OTT)。我也知道浏览器倾向于发送'*/*'在这种情况下会使用默认的输出格式(在这种情况下是JSON)。 – 2010-12-18 15:53:42

+0

@fumachu谢谢澄清,这个“实体”的东西是实际的回应。我在阅读文档时一定错过了它(或者没有明确说明)。 – 2010-12-18 15:54:39