Node.js中Axios请求响应编码异常,如何获取JSON对象?
Axios请求返回乱码,如何获取JSON格式响应?
我使用Axios发起REST调用时收到了乱码响应,代码示例如下:
try { const response = await axios.get("https://api.predic8.de/shop/products/"); console.log(response.data); } catch (error) { console.log(`[Error] -> ${JSON.stringify(error.response.data)}`) }
返回的乱码内容如下:
▼♥��M
�0
5�Z�z�wg�4ӎ�W�����Yjxtʸ��:�Ǐ►_�☺}Y��/�R2~♠$���Ú�V�8\�]!�)☺*����H��>�§��Aj"↕��a0 ݚ��$�颲Y3%je3@=�0��@§lb:�|�}.☺8�K&�_ƫp�j�(o-�ܚ♦
我曾尝试添加编码和Content-Type请求头,但并未解决问题,请问该如何获取JSON格式的响应对象?
解决方案
乱码的核心原因是目标API返回了gzip压缩的响应,而Axios在部分环境(尤其是Node.js)下不会自动处理压缩内容。以下是两种可行的解决方式:
方法一:使用第三方库自动处理压缩
安装axios-gzip库来让Axios自动处理gzip解压:
npm install axios-gzip
配置并发起请求:
import axios from 'axios'; import { gzip } from 'axios-gzip'; // 创建带压缩处理的Axios实例 const axiosClient = axios.create(); gzip(axiosClient); try { const response = await axiosClient.get("https://api.predic8.de/shop/products/", { headers: { 'Accept': 'application/json', // 明确要求JSON格式响应 'Accept-Encoding': 'gzip, deflate' // 告知服务器可返回压缩内容 } }); console.log(response.data); } catch (error) { console.error(error); }
方法二:手动解压响应(Node.js环境)
如果不想引入第三方库,可以通过zlib模块手动处理解压:
const axios = require('axios'); const zlib = require('zlib'); const { promisify } = require('util'); const gunzip = promisify(zlib.gunzip); try { const response = await axios.get("https://api.predic8.de/shop/products/", { responseType: 'arraybuffer', // 以二进制格式接收响应 headers: { 'Accept': 'application/json', 'Accept-Encoding': 'gzip' } }); // 解压并转换为JSON const decompressedBuffer = await gunzip(response.data); const jsonData = JSON.parse(decompressedBuffer.toString('utf8')); console.log(jsonData); } catch (error) { console.error(error); }
注意事项
不要混淆Content-Type和Accept请求头:
Content-Type:用于告知服务器你发送的请求内容类型,此处不需要设置(GET请求无请求体)Accept:用于告知服务器你期望接收的响应内容类型,必须设置为application/json来明确要求JSON格式
内容的提问来源于stack exchange,提问作者Classfield
相关产品推荐
相关产品推荐

