3

编码gzip(iis7)的Ajax发送请求不起作用下面是发送请求的代码有人可以帮助我我的代码有什么问题。

提前致谢

function sendRequest(url, callback, postData)
{
   var req = createXMLHTTPObject();
   if (!req) {
      return;
   }

   var method = (postData) ? "POST" : "GET";
   req.open(method, "xml/" + url, true);
   req.setRequestHeader('User-Agent', 'XMLHTTP/1.0');

   if (postData) {
      req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      req.setRequestHeader("Content-Encoding", "gzip");

   }

   req.onreadystatechange = function() {

   }

   req.send(postData);
}
4

3 回答 3

5

考虑到安全性,浏览器不允许您覆盖某些标头,包括“Content-Encoding”。

于 2012-04-27T06:57:06.137 回答
2

透明地对您的 XMLHttpRequest 请求进行高度压缩的一种方法是使用 HTTP/2(例如,通过 CloudFlare 为您的网站提供服务)。

使用 HTTP/2 时,尽管 HTTP 标头没有说明Content-Encoding: gzip底层 HTTP/2 协议压缩所有内容。

它的压缩效果也比 gzip 好得多,因为:

  • 它压缩标题
  • 标头压缩使用标准字典
  • 我认为数据压缩在多条消息上构建了一个字典(brotli - 我没有仔细检查过)

您可以通过以下方式查看您的服务器是否使用 HTTP/2:

  1. 打开 Chrome,按 F12 打开开发者工具
  2. 单击网络选项卡
  3. 关闭请求检查器面板(有标签Headers Preview Response Timing
  4. 右键单击请求列表的名称标题并勾选Protocol
  5. 导航到您的网站并查看用于所有请求的协议 - 在您不想看到的协议列h2http/1.1

使用 Chrome 开发者工具的 HTTP/2 网络请求的示例日志

我不建议使用 JavaScript 压缩库,因为这会导致速度变慢和效率低下。

于 2019-02-21T00:47:32.353 回答
1

该问题似乎与标头无关,而是与压缩有关。

您似乎没有压缩您的 postData。

如果 postData 已经被压缩,则无需尝试手动设置 content-encoding。

如果不是,要么让浏览器与服务器协商传输编码(这是协议的一部分并自动完成,服务器会说它是否接受,但我认为这种情况很少见)或者(如果你真的需要to) 自己编码。这个 SO 问题表明一个库来压缩浏览器端:Gzip 的 JavaScript 实现

于 2012-04-27T07:12:35.767 回答