REST内容类型:它应该基于扩展名还是Accept头?

时间:2008-12-19 17:11:31

标签: rest

RESTful Web服务返回的表示(html,xml,json)应该由url还是Accept HTTP标头确定?

7 个答案:

答案 0 :(得分:34)

两者都有效。引自xml.com

  

资源可能有多个   表示。有四个   经常使用的方式来提供   正确的资源表示   消费者:

     
      
  1. 服务器驱动的协商。服务提供商确定了权利   从先前的知识表示   其客户或使用该信息   提供在HTTP标头中,如Accept,   Accept-Charset,Accept-Encoding,   Accept-Language和User-Agent。该   这种方法的缺点是   服务器可能没有最好的知识   关于客户真正想要的是什么。
  2.   
  3. 客户驱动的谈判。客户端向a发起请求   服务器。服务器返回一个列表   可用的陈述。该   客户端然后选择表示   它想要并发送第二个请求   服务器。缺点是a   客户需要发送两个请求。
  4.   
  5. 代理驱动的协商。客户端向服务器发起请求   通过代理。代理通过了   请求到服务器并获得一个   陈述清单。代理人   根据选择一个表示   由客户设定的偏好和   将表示返回给   客户端。
  6.   
  7. URI指定的表示。客户端指定它的表示   想要在URI查询字符串中。
  8.   

答案 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的地方......