XMLHttpRequest with gzip
XMLHttpRequest with gzip
使用node.js的request模块,可以很容易地设置一个请求,请求并正确地从源文件中压缩数据:
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)
}
);
然而,我有一些js代码嵌入在一个html文档,也需要做一个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
请求和解压缩的数据。如有任何帮助,将不胜感激。
解决方案
我相信我已经想出怎么做这件事了。假设您已经导入了pako javascript库(javascript链接:这里)进行解压,即
<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。解析,因为膨胀的响应是一个字符串,并保存像{"chocolate":["dark","white",…]}用反斜杠保存,如{'"chocolate'":…}。解析JSON对象的字符串可以使用parse函数完成。
故障排除:这是相当奇怪的数据是如何解释你的XMLHttpRequest。我最初认为你可以设置你的请求类型为"arraybuffer",然后使用FileReader来解析响应字符串。但实际上我是将数组缓冲区转换为blob,然后再转换回FileReader中的数组缓冲区,这完全是多余的,而且很混乱。
可能与浏览器有关:http://www.w3c-test.org/XMLHttpRequest/response-data-gzip.htm例如,这个测试在IE上失败。您必须使用以下库手动压缩响应,例如:https://github.com/nodeca/pako
相关文章:
- Fighting with FRP
- issue with FB.Event.subscribe
- geolocation-marker.js conflict with markerclusterer.js
- Angular 2.0 with JavaScript or TypeScript?
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- WebComponentsJS with IE10
- 指令的模板必须只有一个根元素:With restrict E&替换true
- timeago.js with datatable and PHP
- Ajax and Json with Rails
- errors with Javascript try catch
- how to split a string with ','
- Understanding Javascript scope with "var that = this&qu
- Architecture for CPU intensive tasks with NodeJS & Socke
- How to declare a Map containing certain properties with flow
- 设置'这'在React with Inverse Data Flow中
- Unit-testing multiple use cases with Karma & Mocha.js
- Modify Javascript with C#
- 谷歌地图API v3:Initial View is Fine,but Gray Box with No Map if
- Using jQuery with classes from ES6
- XMLHttpRequest with gzip