RESTful Web服务返回的表示(html,xml,json)应该由url还是Accept HTTP标头确定?
答案 0 :(得分:34)
两者都有效。引自xml.com:
资源可能有多个 表示。有四个 经常使用的方式来提供 正确的资源表示 消费者:
- 服务器驱动的协商。服务提供商确定了权利 从先前的知识表示 其客户或使用该信息 提供在HTTP标头中,如Accept, Accept-Charset,Accept-Encoding, Accept-Language和User-Agent。该 这种方法的缺点是 服务器可能没有最好的知识 关于客户真正想要的是什么。
- 客户驱动的谈判。客户端向a发起请求 服务器。服务器返回一个列表 可用的陈述。该 客户端然后选择表示 它想要并发送第二个请求 服务器。缺点是a 客户需要发送两个请求。
- 代理驱动的协商。客户端向服务器发起请求 通过代理。代理通过了 请求到服务器并获得一个 陈述清单。代理人 根据选择一个表示 由客户设定的偏好和 将表示返回给 客户端。
- URI指定的表示。客户端指定它的表示 想要在URI查询字符串中。
醇>
答案 1 :(得分:17)
这是一个非问题。
接受取决于conneg(内容协商)。 Conneg将让客户通过Accept:标头决定他们接受的媒体类型。然后响应将采用该格式,以及Vary:Accept标头。
另一方面,将资源公开为/resource.json和/resource.xml也是完全有效的。
理想的是实现两者: / resource(支持连接的通用uri) /resource.xml /resource.json
/ resource返回的连接版本可以根据协商的媒体类型简单地重定向到正确的uri。或者,可以从通用uri返回正确的表示,并使用Content-Location指定返回的特定表示。
答案 2 :(得分:8)
由于您提到的是RESTful Web服务,而不是任何Web服务,我强烈要求基础标准支持的内容 - HTTP 1.1及其依赖Accept
HTTP标头的内容协商。
正如我在对Can I change the headers of the HTTP request send by the browser的回答中所解释的那样,地址(URI)和表示是RESTful设计的两个不同支柱,它们不需要混合。 当Accept
标题时,不应滥用URI来嵌入可接受的表示。
只有当您的Web应用程序可能在中间节点涉及某些HTTP标头过滤的环境中运行和使用时,您才应支持基于URI的内容协商。说实话,如果可行且可行的话,应该替换这种侵入性或不正常运行的代理。
干杯!
Shonzilla
答案 3 :(得分:6)
使用Accept标头(如果提供),URI作为故障转移。
答案 4 :(得分:4)
使用内容类型存在问题...我在我的博客http://shouldersofgiants.co.uk/Blog上讨论了这个问题,并最终确定了在Richardson和Ruby的RESTful Web服务中建议的URI中包含表示
答案 5 :(得分:1)
由于很多RESTful URL没有扩展名,因此您应该/必须基于Content-Type
编辑:我并不是说这听起来像它那样苛刻,更多的是你必须注意内容类型并且不会总是能够引用扩展名
答案 6 :(得分:1)
请参阅Chapter 5 - Representational State Transfer (REST),Roy Fielding关于建筑风格dissertation的 5.2.1.2陈述部分:
表示的数据格式称为媒体类型[48]。
查看链接,我们看到它指的是MIME。所以我假设在HTTP的说法中,它用POST / PUT的Content-Type
标头和GET的Accept
标头表示。
以下是段落的其余部分(完整性):
表示可以包含在消息中并由处理 收件人根据消息的控制数据和性质 媒体类型。某些媒体类型旨在实现自动化 处理,一些旨在呈现供用户查看, 还有一些能够兼得。可以使用复合媒体类型 在单个消息中包含多个表示。
P.S。:我不确定为什么人们永远不会看到实际定义REST的地方......