Node.js https.get调用Stack Exchange API乱码 如何强制明文编码
核心原因
Stack Exchange API 会强制对所有响应启用gzip压缩,会忽略请求头中Accept-Encoding: identity的配置,你当前代码拿到的是未解压的gzip二进制流,直接按UTF-8编码转字符串就会出现乱码。
解决方案
需要引入Node.js内置的zlib模块对响应流做gzip解压,修改后的代码如下:
import { get, RequestOptions } from 'https'; import { createGunzip } from 'zlib'; const getRequest = (url: string) => new Promise((resolve, reject) => { const options: RequestOptions = { headers: { 'Accept': 'application/json', } } const req = get(url, options, (res) => { // 判断响应是否为gzip压缩 const stream = res.headers['content-encoding']?.includes('gzip') ? res.pipe(createGunzip()) : res; stream.setEncoding('utf8'); let responseBody = ''; stream.on('data', (chunk) => responseBody += chunk); stream.on('end', () => resolve(responseBody)); stream.on('error', (err) => reject(err)); }); req.on('error', (err) => reject(err)); req.end(); })
原有调用逻辑不需要修改,执行后即可拿到正常的JSON明文响应。
内容的提问来源于stack exchange,提问作者KyleMit
相关产品推荐
相关产品推荐

