Axios请求Google搜索接口返回乱码,Postman正常问题求助
解决Axios请求Google返回乱码的问题
问题原因
Google会根据请求头的Accept-Encoding返回gzip/br/deflate压缩后的内容,Postman默认会自动识别并解压这些压缩格式,但Axios默认不具备自动解压能力,因此直接拿到的是原始二进制压缩数据,显示为乱码。另外,请求头中的User-Agent不一致也可能导致返回内容差异。
解决方案
方法1:手动处理压缩内容
通过Node.js的zlib模块手动解压响应数据,步骤如下:
- 配置Axios请求头,指定接受压缩格式,并设置
responseType: 'arraybuffer'以获取二进制数据 - 根据响应头的
content-encoding判断压缩类型,调用对应解压方法 - 将解压后的二进制数据转为UTF-8字符串
示例代码:
const axios = require('axios'); const zlib = require('zlib'); const { promisify } = require('util'); // 把zlib的异步方法转为Promise形式 const gunzip = promisify(zlib.gunzip); const brotliDecompress = promisify(zlib.brotliDecompress); const inflate = promisify(zlib.inflate); async function fetchGoogleSearch() { const response = await axios.get('https://www.google.com/search?q=test', { headers: { // 和Postman一致的请求头,重点是Accept-Encoding和User-Agent 'Accept-Encoding': 'gzip, deflate, br', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }, responseType: 'arraybuffer' // 必须指定,否则会把二进制数据当成字符串解析导致乱码 }); let decodedData; // 根据响应头判断压缩类型并解压 switch (response.headers['content-encoding']) { case 'gzip': decodedData = await gunzip(response.data); break; case 'br': decodedData = await brotliDecompress(response.data); break; case 'deflate': decodedData = await inflate(response.data); break; default: decodedData = response.data; } // 转为UTF-8字符串 console.log(decodedData.toString('utf8')); } fetchGoogleSearch();
方法2:配置Axios自动处理压缩
通过Axios的transformResponse配置全局处理响应,实现自动解压:
const axios = require('axios'); const zlib = require('zlib'); const { promisify } = require('util'); const gunzip = promisify(zlib.gunzip); const brotliDecompress = promisify(zlib.brotliDecompress); const inflate = promisify(zlib.inflate); // 创建配置好的Axios实例 const axiosInstance = axios.create({ headers: { 'Accept-Encoding': 'gzip, deflate, br', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }, transformResponse: [async (data, headers) => { if (!data) return data; // 自动判断压缩类型并解压 switch (headers['content-encoding']) { case 'gzip': return (await gunzip(data)).toString('utf8'); case 'br': return (await brotliDecompress(data)).toString('utf8'); case 'deflate': return (await inflate(data)).toString('utf8'); default: return data.toString('utf8'); } }] }); async function fetchGoogle() { const res = await axiosInstance.get('https://www.google.com/search?q=test'); console.log(res.data); // 直接拿到解码后的HTML内容 } fetchGoogle();
关键注意点
- 必须确保Axios的请求头和Postman完全一致,尤其是
User-Agent和Accept-Encoding,Google会根据UA返回不同内容,甚至拦截非浏览器UA请求 - 不要遗漏
responseType: 'arraybuffer',否则Axios会默认把二进制压缩数据当成UTF-8字符串解析,直接导致乱码
内容的提问来源于stack exchange,提问作者KarimS
相关产品推荐
相关产品推荐

