Nodejs,表达http请求 - 响应不解压缩
Nodejs, express http request - response not unzipping
我正在尝试编写一个创建 HTTPS 请求的函数。
这是使用 Typescript 的 expressjs 项目的全部内容。
我可以使 HTTPS 请求正常工作并获得响应 - 但响应是使用 GZIP 编码的。我正在尽力遵循文档。但运气不好,响应保持压缩状态。
这是我的代码
private getData = (host, pathname): Promise<string> => {
return new Promise((resolve, reject) => {
const options = {
hostname: host,
path: pathname,
gzip: true,
method: 'GET',
headers: {'x-apikey': 'XXXX'}
}
const req = https.request(options, (res) => {
if (res.statusCode < 200 || res.statusCode >= 300) {
console.log('error!')
return reject(new Error('statusCode=' + res.statusCode));
}
let body = '';
res.on('data', function (chunk) {
body += chunk;
});
res.on('end', function () {
try {
console.log('res.headers', res.headers)
console.log('res.headers', body)
body = JSON.parse.toString();
resolve(body);
} catch (e) {
reject(e);
}
resolve(body);
});
req.on('error', (e) => {
reject(e.message);
});
// send the request
});
req.end();
});
}
控制台日志语句显示了这一点
很明显,JSONparsing 失败了。我错过了什么?
感谢大家的帮助
https.request()
本身不支持 gzip 压缩。因此,您必须自己添加对它的支持,如图所示 here or use an https request library such as got()
已经支持 gzip(并且也已经支持 promises)。
import got from 'got';
private getData = (host, pathname): Promise<string> => {
const options = {
method: 'GET',
headers: {'x-apikey': 'XXXX'}
}
return got(`https://${host}${pathname}`, options).json();
}
仅供参考,您的问题中并不清楚您期望得到何种类型的答复。您尝试使用:
body = JSON.parse.toString();
这没有任何意义,因为 JSON.parse.toString()
试图获取 JSON.parse
函数的字符串版本,而实际上什至没有调用该函数 - 非常奇怪。也许你的意思是 JSON.parse(body)
?但是,你的打字稿让你看起来像是在期待一个解析为字符串的承诺,所以这通常不是 JSON 解析的结果。
如果您希望得到 gzipped JSON 响应,那么您可以使用:
return got(`https://${host}${pathname}`, options).json();
我在上面显示。如果您只需要一个字符串,而不是 JSON,那么您可以将该行更改为:
return got(`https://${host}${pathname}`, options).text();
我正在尝试编写一个创建 HTTPS 请求的函数。
这是使用 Typescript 的 expressjs 项目的全部内容。
我可以使 HTTPS 请求正常工作并获得响应 - 但响应是使用 GZIP 编码的。我正在尽力遵循文档。但运气不好,响应保持压缩状态。
这是我的代码
private getData = (host, pathname): Promise<string> => {
return new Promise((resolve, reject) => {
const options = {
hostname: host,
path: pathname,
gzip: true,
method: 'GET',
headers: {'x-apikey': 'XXXX'}
}
const req = https.request(options, (res) => {
if (res.statusCode < 200 || res.statusCode >= 300) {
console.log('error!')
return reject(new Error('statusCode=' + res.statusCode));
}
let body = '';
res.on('data', function (chunk) {
body += chunk;
});
res.on('end', function () {
try {
console.log('res.headers', res.headers)
console.log('res.headers', body)
body = JSON.parse.toString();
resolve(body);
} catch (e) {
reject(e);
}
resolve(body);
});
req.on('error', (e) => {
reject(e.message);
});
// send the request
});
req.end();
});
}
控制台日志语句显示了这一点
很明显,JSONparsing 失败了。我错过了什么?
感谢大家的帮助
https.request()
本身不支持 gzip 压缩。因此,您必须自己添加对它的支持,如图所示 here or use an https request library such as got()
已经支持 gzip(并且也已经支持 promises)。
import got from 'got';
private getData = (host, pathname): Promise<string> => {
const options = {
method: 'GET',
headers: {'x-apikey': 'XXXX'}
}
return got(`https://${host}${pathname}`, options).json();
}
仅供参考,您的问题中并不清楚您期望得到何种类型的答复。您尝试使用:
body = JSON.parse.toString();
这没有任何意义,因为 JSON.parse.toString()
试图获取 JSON.parse
函数的字符串版本,而实际上什至没有调用该函数 - 非常奇怪。也许你的意思是 JSON.parse(body)
?但是,你的打字稿让你看起来像是在期待一个解析为字符串的承诺,所以这通常不是 JSON 解析的结果。
如果您希望得到 gzipped JSON 响应,那么您可以使用:
return got(`https://${host}${pathname}`, options).json();
我在上面显示。如果您只需要一个字符串,而不是 JSON,那么您可以将该行更改为:
return got(`https://${host}${pathname}`, options).text();