【问题标题】:XMLHttpRequest with gzip带有 gzip 的 XMLHttpRequest
【发布时间】:2016-01-03 04:51:09
【问题描述】:

使用 node.js 的 request module,很容易设置一个请求并正确地从源压缩数据:

var request = require('request');
var requestOptions = {
    url: 'http://whatever.com/getDataWithCompression',
    gzip: true  // <--- this is all that is required
};
request(
    requestOptions,
    function (error, response, data) {
        // do stuff with data (which is already decompressed)
    }
);

但是,我在 html 文档中嵌入了一些 js 代码,也需要发出 http 请求,所以没有 node.js request 模块,我使用 XMLHttpRequest 代替:

var request = new XMLHttpRequest();
request.open('GET', 'http://whatever.com/getData', true);
request.onload = function() {
    // do stuff with request.responseText
};
request.send();

但是,尽管进行了很多谷歌搜索,但我无法弄清楚如何发出 XMLHttpRequest 请求并解压缩 gzip 压缩的数据。将不胜感激任何帮助。

【问题讨论】:

    标签: javascript node.js request xmlhttprequest httprequest


    【解决方案1】:

    可能与浏览器有关:http://www.w3c-test.org/XMLHttpRequest/response-data-gzip.htm 例如,此测试在 IE 上失败。您必须使用此库手动压缩响应,例如:https://github.com/nodeca/pako

    【讨论】:

      【解决方案2】:

      解决方案

      我相信我已经知道如何做到这一点。假设你已经导入了pako javascript library(Javascript 链接:here)进行解压,即

      <script type="text/javascript" src="pako.js"></script>
      

      然后就可以解压数据了,比如压缩的JSON格式,这样:

      var data;
      var request = new XMLHttpRequest();
      request.responseType = 'arraybuffer';
      request.onload = function() {
        data = JSON.parse(pako.inflate(request.response, { to: 'string' }));
      };
      request.open('GET',"data.gzip");
      request.send();
      

      注意,我使用 JSON.parse,因为膨胀的响应是一个字符串,并且保存的数据像 {"chocolate":["dark","white",...]} 用反斜杠保存,例如 { \“巧克力\”: ...}。可以使用 parse 函数解析 JSON 对象的字符串。

      疑难解答:

      XMLHttpRequest 是如何解释数据的,这很奇怪。我最初认为您可以将请求类型设置为“arraybuffer”,然后使用 FileReader 解析响应字符串。但实际上我是在将数组缓冲区转换为 blob 以转换回 FileReader 中的数组缓冲区,这完全是多余且一团糟。

      【讨论】:

        猜你喜欢
        • 2013-01-21
        • 2017-11-03
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        相关资源
        最近更新 更多