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


70

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

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

问题是我没有找到一种方法告诉浏览器更改此标头。

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


我听到你了 对某些标头进行硬编码非常好,在浏览器选项卡中,只需访问URL即可测试您的代码。我不需要像Chrome Postman应用程序这样功能完善的单独界面。
Sridhar Sarnobat '16

Answers:


8

我认为不可能以您尝试的方式进行。

指示接受的数据格式通常是通过将扩展名添加到资源名称来完成的。所以,如果您有类似的资源

/resources/resource

GET /resources/resource返回其HTML表示形式,以表明您希望使用其XML表示形式,可以使用以下模式:

/resources/resource.xml

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

或按照James的建议使用Javascript。


42

我会部分不同意米兰关于将请求的表示形式嵌入URI的建议。

如果可能,URI应该用于寻址资源,而不用于隧道HTTP方法/动词。最终,如果仅创建(POST)或更新(PUT)不能达到目的,则可以将特定的业务操作(编辑,锁定等)嵌入URI:

POST http://shonzilla.com/orders/08/165;编辑

在请求URI中的特定表示形式的情况下,您将需要破坏URI设计,最终使其变得更丑陋,在同一位置(即URI)混合两个不同的REST概念,并使在服务器端进行一般处理请求变得更加困难。米兰在暗示什么,许多人正在这样做,包括。Flickr,就是这样。

取而代之的是,更RESTful的方法是使用单独的位置通过使用AcceptHTTP头对首选表示进行编码,该HTTP头用于内容协商,其中客户端告诉服务器它可以处理/处理的内容类型,服务器尝试满足客户端的请求。此方法是HTTP 1.1标准的一部分,该标准也与网络浏览器兼容并受其支持。

比较一下:

GET /orders/08/165.xml HTTP / 1.1
要么
GET / orders / 08/165&format = xml HTTP / 1.1

对此:

GET / orders / 08/165 HTTP / 1.1
接受:application / xml

在Web浏览器中,您可以使用objectsetRequestHeader方法请求任何内容类型XMLHttpRequest。例如:

函数getOrder(year,AnnualOrderId,contentType){
 var client = new XMLHttpRequest();
 client.open(“ GET”,“ / order /” +年+“ /” + AnnualOrderId);
 client.setRequestHeader(“ Accept”,contentType);
 client.send(orderDetails);
}

总结一下:地址,即资源的URI应该独立于其表示形式,并且XMLHttpRequest.setRequestHeader方法允许您使用AcceptHTTP标头请求任何表示形式。

干杯!
肖纳斯


3
缺点是不可能直接链接到XML资源。对于某些应用程序,可能需要这样做。例如,在OpenCPU,图形可被检索PNGPDFSVG格式。但是,PNG如果Accept检索需要标题,则无法将图像嵌入HTML页面。
Jeroen 2014年

2
@Jeroen:如果浏览器比PNG更好地支持SVG,则应发送SVG权重高于PNG的Accept标头,并以SVG进行响应。对于不支持SVG的浏览器,其Accept标头将不包含application / svg + xml,因此服务器将发回PNG。如果出于某种原因您认为PNG版本比PDF / SVG版本具有更高的保真度(例如,矢量跟踪图片),则服务器应为PNG版本设置更高的权重,以便在浏览器支持所有PNG版本时将其返回。三个相等。这就是应该进行内容协商的方式。
Lie Ryan

这个回应几乎使我信服,但是后来我看到了对类似主题的回应,我倾向于同意后者。在许多(或大多数)情况下,格式信息实际上是资源标识的一部分,可以(或应该)包含在URI中,以便避免在不同客户端之间共享此类URI后出现意外结果。在这些情况下,Accepts标头应起辅助作用。区分这些情况很重要。
ps_ttf

12

我试图做完全相同的事情(RESTful Web服务),但偶然发现了这个firefox插件,它使您可以修改请求的接受标头(实际上是任何请求标头)。完美运作。

https://addons.mozilla.org/zh-CN/firefox/addon/967/


克里斯,如果该扩展程序存在错误,或者该扩展程序无法与您想要的浏览器版本一起使用,或者开发人员只是停止了更新扩展程序,该怎么办?我看到,即使不是全部的Firefox扩展,大多数(即使不是全部)扩展都可以让您添加/修改请求标头。附加功能可能很容易并且可以提高您的生产力,但是在扩展出现问题时将无法正常工作。
MasterJoe


firefox和chrome插件不再有效
JRichardsz

3

适用于Google Chrome的ModHeader扩展程序也是一个不错的选择。您只需设置所需的标题,然后在浏览器中输入URL,当您点击该URL时,它将自动从扩展名中获取标题。唯一的事情是,它将为您击中的每个URL发送标题,因此您必须在使用后禁用或删除它。


第一次尝试工作!谢谢!!
JRichardsz

1

使用一些JavaScript!

xmlhttp = new XMLHttpRequest();
xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist)
xmlhttp.send(“页面内容在这里”);

感谢您的快速答复,但问题是关于更改HTTP请求中发送的默认标头。特别是Accept标头。
Jeroen Wyseur

附带说明一下,该规范(w3.org/TR/2006/WD-XMLHttpRequest-20060405/#dfn-open)对PUT和DELETE没有任何说明,请参阅编辑说明。同样,在这种情况下,没有提交是一个很好的ajaxified用户界面,但否则不是。
Jeroen Wyseur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.