RESTful Web服务返回的表示形式(html,xml,json)应该由url还是Accept HTTP标头确定?
两者都有效.来自xml.com的报价:
资源可以具有多个表示.有四种常用的方法可以向消费者提供正确的资源表示:
服务器驱动的协商.服务提供商根据其客户端的先验知识确定正确的表示,或使用HTTP头中提供的信息,如Accept,Accept-Charset,Accept-Encoding,Accept-Language和User-Agent.这种方法的缺点是服务器可能不了解客户真正想要的内容.
客户驱动的谈判.客户端向服务器发起请求.服务器返回可用表示的列表.然后,客户端选择它想要的表示,并向服务器发送第二个请求.缺点是客户端需要发送两个请求.
代理驱动的协商.客户端通过代理向服务器发起请求.代理将请求传递给服务器并获取表示列表.代理根据客户端设置的偏好选择一个表示,并将表示返回给客户端.
URI指定的表示.客户端在URI查询字符串中指定它想要的表示.
这不是问题.
接受取决于连接(内容协商).Conneg将让客户通过Accept:标头决定他们接受的媒体类型.然后响应将采用该格式,以及Vary:Accept标头.
另一方面,将资源公开为/resource.json和/resource.xml也是完全有效的.
理想情况是实现:/ resource(支持conneg的通用uri)/resource.xml /resource.json
/ resource返回的连接版本可以根据协商的媒体类型简单地重定向到正确的uri.或者,可以从通用uri返回正确的表示,并使用Content-Location指定返回的特定表示.
由于您提到的是RESTful Web服务而不是任何Web服务,因此我强烈要求基础标准支持的内容 - HTTP 1.1及其依赖Accept
HTTP头的内容协商.
正如我在回答中所解释的那样,我可以更改浏览器发送的HTTP请求的标头,地址(URI)和表示是RESTful设计的两个不同支柱,它们不需要混合.当有Accept
标题时,不应滥用URI来嵌入可接受的表示.
只有当您的Web应用程序可能在中间节点涉及某些HTTP标头过滤的环境中运行和使用时,您才应支持基于URI的内容协商.说实话,如果可行且可行的话,应该替换这种侵入性或不正常运行的代理.
干杯!
Shonzilla
使用Accept标头(如果提供),URI作为故障转移.