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

Jer*_*eur 65 browser rest http-headers

我寻找到一个宁静的设计,想用HTTP方法(POST,GET尽可能多地,...)和HTTP标头.我已经发现了HTTP方法PUTDELETE不从浏览器的支持.

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

问题是我找不到告诉我的浏览器改变这个标题的方法.

<a..>标签具有一个类型的属性,可以有一个MIME类型,看起来像一个很好的候选人,但头仍然是浏览器的默认(在Firefox它可以改变在about:confignetwork.http.accept.default键).

Sho*_*lla 42

我部分不同意米兰关于在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方法允许您使用AcceptHTTP头请求任何表示.

干杯!
Shonzilla

  • 缺点是不可能(超)链接直接说"XML"资源.对于某些应用,可能需要这样做.例如,在OpenCPU中,可以以"PNG","PDF"或"SVG"格式检索图形.但是,如果需要"Accept"标题进行检索,则无法在HTML页面中嵌入"PNG"图像. (3认同)
  • @Jeroen:如果浏览器支持SVG优于PNG,那么它应该发送一个SVG加权高于PNG的Accept头,并用SVG响应.对于不支持SVG的浏览器,其Accept标头不包含application/svg + xml,因此服务器将发回PNG.如果由于某种原因您认为PNG版本具有比PDF/SVG版本更高的保真度(例如矢量跟踪照片),那么服务器应该为PNG版本设置更高的权重,以便在浏览器支持所有版本时返回它三个平等.这就是内容协商应该如何工作的方式. (2认同)

小智 12

我本来想做同样的事情(RESTful Web服务),我偶然发现了这个firefox插件,它允许你修改请求的接受标头(实际上是任何请求标头).它完美地运作.

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


Mil*_*ota 8

我不认为以你想要的方式做到这一点.

通常通过将扩展名添加到资源名称来指示接受的数据格式.所以,如果你有像这样的资源

/resources/resource
Run Code Online (Sandbox Code Playgroud)

GET /resources/resource返回其HTML表示,以表示您想要其XML表示,您可以使用以下模式:

/resources/resource.xml
Run Code Online (Sandbox Code Playgroud)

然后,您必须在服务器端执行接受的内容类型确定魔术.

或者像James建议的那样使用Javascript.


Jai*_*rak 5

Google Chrome 的ModHeader扩展,也是一个不错的选择。你可以设置你想要的标题,然后在浏览器中输入 URL,当你点击 url 时,它会自动从扩展中获取标题。唯一的问题是,它会为您将点击的每个 URL 发送标头,因此您必须在使用后禁用或删除它。