我正在尝试发送一个简单的HTTP POST请求,检索响应正文。以下是我的代码。我正在
错误:标题检查不正确
在“zlib.gunzip”方法中。我是node.js的新手,我很感激任何帮助。
fireRequest: function() {
var rBody = '';
var resBody = '';
var contentLength;
var options = {
'encoding' : 'utf-8'
};
rBody = fSystem.readFileSync('resources/im.json', options);
console.log('Loaded data from im.json ' + rBody);
contentLength = Buffer.byteLength(rBody, 'utf-8');
console.log('Byte length of the request body ' + contentLength);
var httpOptions = {
hostname : 'abc.com',
path : '/path',
method : 'POST',
headers : {
'Authorization' : 'Basic VHJhZasfasNWEWFScsdfsNCdXllcjE6dHJhZGVjYXJk',
'Content-Type' : 'application/json; charset=UTF=8',
// 'Accept' : '*/*',
'Accept-Encoding' : 'gzip,deflate,sdch',
'Content-Length' : contentLength
}
};
var postRequest = http.request(httpOptions, function(response) {
var chunks = '';
console.log('Response received');
console.log('STATUS: ' + response.statusCode);
console.log('HEADERS: ' + JSON.stringify(response.headers));
// response.setEncoding('utf8');
response.setEncoding(null);
response.on('data', function(res) {
chunks += res;
});
response.on('end', function() {
var encoding = response.headers['content-encoding'];
if (encoding == 'gzip') {
zlib.gunzip(chunks, function(err, decoded) {
if (err)
throw err;
console.log('Decoded data: ' + decoded);
});
}
});
});
postRequest.on('error', function(e) {
console.log('Error occured' + e);
});
postRequest.write(rBody);
postRequest.end();
}
答案 0 :(得分:16)
response.on('data', ...)
可以接受Buffer
,而不只是简单的字符串。连接时你正在转换为字符串不正确,然后以后不能gunzip。您有两个选择:
1)收集数组中的所有缓冲区,并在end
事件中使用Buffer.concat()
连接它们。然后在结果上调用gunzip。
2)使用.pipe()
并将响应传递给gunzip对象,如果您希望将结果存储在内存中,则将其输出传递给文件流或字符串/缓冲区字符串。
这里讨论选项(1)和(2):http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression
答案 1 :(得分:1)
在我们的例子中,我们在标题中添加了'accept-encoding': 'gzip,deflate'
,代码开始工作(解决方案归功于Arul Mani):
var httpOptions = {
hostname : 'abc.com',
path : '/path',
method : 'POST',
headers : {
...
'accept-encoding': 'gzip,deflate'
}
};
答案 2 :(得分:0)
我尝试与fs.readdirSync
循环时遇到此错误,但是有一个.Dstore
文件,因此已对其应用了解压缩功能。
请注意仅通过.zip/gz
import gunzip from 'gunzip-file';
const unzipAll = async () => {
try {
const compFiles = fs.readdirSync('tmp')
await Promise.all(compFiles.map( async file => {
if(file.endsWith(".gz")){
gunzip(`tmp/${file}`, `tmp/${file.slice(0, -3)}`)
}
}));
}
catch(err) {
console.log(err)
}
}