我正在寻找一个宁静的设计,并希望尽可能使用HTTP方法(POST
,GET
,...)和HTTP标头。我已经发现浏览器不支持HTTP方法PUT
和DELETE
。
现在,我希望获得相同资源的不同表示形式,并希望通过更改请求的Accept
标头来实现此目的。根据此Accept
标头,服务器可以在同一资源上提供不同的视图。
问题是我找不到告诉浏览器更改此标头的方法。
<a..>
标记有一个type attribute,可以有一个mime类型,看起来像一个好的候选者,但标题仍然是浏览器的默认值(在Firefox中,它可以在{{1}中更改使用about:config
键)。
答案 0 :(得分:38)
我部分不同意米兰关于在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 standard的一部分,兼容软件并且也受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
在网络浏览器中,您可以使用setRequestHeader
XMLHttpRequest
对象的XMLHttpRequest.setRequestHeader
方法请求任何内容类型。例如:
function getOrder(year, yearlyOrderId, contentType) { var client = new XMLHttpRequest(); client.open("GET", "/order/" + year + "/" + yearlyOrderId); client.setRequestHeader("Accept", contentType); client.send(orderDetails); }
总结一下:地址,即资源的URI应独立于其表示,Accept
方法允许您使用{{1}} HTTP标头请求任何表示。
干杯!
Shonzilla
答案 1 :(得分:12)
我本来想做同样的事情(RESTful Web服务),我偶然发现了这个firefox插件,它允许你修改请求的接受标头(实际上是任何请求标头)。它运作得很好。
答案 2 :(得分:8)
我认为不可能以你想要的方式做到这一点。
通常通过将扩展名添加到资源名称来指示接受的数据格式。所以,如果你有像
这样的资源/resources/resource
和GET /resources/resource
返回其HTML表示,以表示您想要其XML表示,您可以使用以下模式:
/resources/resource.xml
您必须在服务器端执行接受的内容类型确定魔术,然后。
或者像詹姆斯建议的那样使用Javascript。
答案 3 :(得分:1)
使用一些javascript!
xmlhttp=new XMLHttpRequest(); xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist) xmlhttp.send("page content goes here");
答案 4 :(得分:1)
ModHeader用于Google Chrome浏览器的扩展程序也是一个不错的选择。您只需设置所需的标题,然后在浏览器中输入URL,当您点击该URL时,它将自动从扩展名中获取标题。唯一的事情是,它将为您击中的每个URL发送标题,因此您必须在使用后禁用或删除它。