我寻找到一个宁静的设计,想用HTTP方法(POST
,GET
尽可能多地,...)和HTTP标头.我已经发现了HTTP方法PUT
和DELETE
不从浏览器的支持.
现在我想要获得相同资源的不同表示,并希望通过更改Accept
请求的标头来实现此目的.根据此Accept
标头,服务器可以在同一资源上提供不同的视图.
问题是我找不到告诉我的浏览器改变这个标题的方法.
该
标签具有一个类型的属性,可以有一个MIME类型,看起来像一个很好的候选人,但头仍然是浏览器的默认(在Firefox它可以改变在about:config
与network.http.accept.default
键).
我部分不同意米兰关于在URI中嵌入所请求的表示的建议.
如果可能的话,URI应仅用于寻址资源而不用于隧道化HTTP方法/动词.最终,如果单独创建(POST)或更新(PUT)不能达到目的,则可以在URI中嵌入特定的业务操作(编辑,锁定等):
POST http://shonzilla.com/orders/08/165;edit
在请求URI中的特定表示的情况下,您需要破坏您的URI设计,最终使其变得更加丑陋,在同一个地方(即URI)混合两个不同的REST概念,并使得在服务器端一般处理请求变得更加困难.米兰的建议和许多人都在做同样的事情,包括.Flickr就是这样.
相反,更RESTful的方法是使用单独的位置来编码首选表示,方法Accept
是使用HTTP头,用于内容协商,其中客户端告诉服务器它可以处理/处理哪些内容类型,服务器尝试满足客户端的请求.此方法是HTTP 1.1标准的一部分,也符合软件并且也受Web浏览器的支持.
比较一下:
GET /orders/08/165.xml HTTP/1.1 or GET /orders/08/165&format=xml HTTP/1.1
对此:
GET /orders/08/165 HTTP/1.1 Accept: application/xml
在Web浏览器中,您可以使用object setRequestHeader
方法请求任何内容类型XMLHttpRequest
.例如:
function getOrder(year, yearlyOrderId, contentType) { var client = new XMLHttpRequest(); client.open("GET", "/order/" + year + "/" + yearlyOrderId); client.setRequestHeader("Accept", contentType); client.send(orderDetails); }
总结一下:地址,即资源的URI应该独立于其表示,并且XMLHttpRequest.setRequestHeader
方法允许您使用Accept
HTTP头请求任何表示.
干杯!
Shonzilla
我本来想做同样的事情(RESTful Web服务),我偶然发现了这个firefox插件,它允许你修改请求的接受标头(实际上是任何请求标头).它完美地运作.
https://addons.mozilla.org/en-US/firefox/addon/967/
我不认为以你想要的方式做到这一点.
通常通过将扩展名添加到资源名称来指示接受的数据格式.所以,如果你有像这样的资源
/resources/resource
并GET /resources/resource
返回其HTML表示,以表示您想要其XML表示,您可以使用以下模式:
/resources/resource.xml
然后,您必须在服务器端执行接受的内容类型确定魔术.
或者像James建议的那样使用Javascript.