HTTP GET请求中UTF-8编码失效问题排查求助
匈牙利语API响应编码问题排查与修复
核心问题分析
- GET请求错误携带请求体:你用了GET方法却调用
req.write(postData),GET请求不需要发送请求体,这会导致服务器解析请求异常,返回内容的编码逻辑混乱。 - 分块响应处理不当:在
data事件中每次都写入文件,且直接拼接Buffer转字符串,会造成编码截断或转码错误——Buffer默认转字符串用utf8,但如果服务器返回的是其他编码(比如匈牙利语常用的ISO-8859-2),就会出现乱码或转义问题。 - 未匹配服务器返回编码:盲目强制用utf8转码,没有根据服务器
Content-Type头里的charset来选择对应编码。
修复后的代码
const https = require('https'); const fs = require('fs'); function apiCall() { const postData = `DateFrom=2022-11-15&DateTill=2022-11-15`; const options = { protocol: 'https:', host: 'link.com', path: `/v1.1/Order/Find?${postData}`, method: 'GET', headers: { "Api-Key": apiKey, } }; const req = https.request(options, (res) => { console.log('statusCode:', res.statusCode); console.log('Content-Type:', res.headers['content-type']); // 查看服务器返回的编码信息 // 先收集所有响应分块 const chunks = []; res.on('data', (d) => { chunks.push(d); }); // 响应结束后统一处理编码与写入 res.on('end', () => { const contentType = res.headers['content-type'] || ''; // 从响应头提取编码格式 const charsetMatch = contentType.match(/charset=([^;]+)/); const encoding = charsetMatch ? charsetMatch[1] : 'utf8'; try { const answer = Buffer.concat(chunks).toString(encoding); fs.writeFileSync(__dirname + "/logs/result.xml", answer, encoding); console.log('文件写入完成'); } catch (err) { console.error('编码转换错误:', err); } }); res.on("error", (err) => { console.error('响应错误:', err); }); }); // GET请求无需写入请求体,直接结束请求 req.on('error', (e) => { console.error(`Hiba: + ${e}`); }); req.end(); };
额外排查建议
- 先查看打印的
Content-Type值,确认服务器返回的编码类型(比如匈牙利语常见的ISO-8859-2或Windows-1250),确保转码时使用对应编码。 - 核对API文档,确认接口要求的请求方式和参数传递规则,保证请求完全符合规范。
内容的提问来源于stack exchange,提问作者Denes
相关产品推荐
相关产品推荐

