我可以更改浏览器发送的HTTP请求的标头吗?

时间:2008-12-17 15:25:49

标签: rest browser http-headers

我正在寻找一个宁静的设计,并希望尽可能使用HTTP方法(POSTGET,...)和HTTP标头。我已经发现浏览器不支持HTTP方法PUTDELETE

现在,我希望获得相同资源的不同表示形式,并希望通过更改请求的Accept标头来实现此目的。根据此Accept标头,服务器可以在同一资源上提供不同的视图。

问题是我找不到告诉浏览器更改此标头的方法。

<a..>标记有一个type attribute,可以有一个mime类型,看起来像一个好的候选者,但标题仍然是浏览器的默认值(在Firefox中,它可以在{{1}中更改使用about:config键)。

5 个答案:

答案 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插件,它允许你修改请求的接受标头(实际上是任何请求标头)。它运作得很好。

https://addons.mozilla.org/en-US/firefox/addon/967/

答案 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发送标题,因此您必须在使用后禁用或删除它。