我的Ajax返回结果出现奇怪字符,开头138d结尾0该如何禁用?
解决Ajax返回结果首尾出现额外字符的问题
问题原因
你观察到的138d开头、0结尾的额外字符,是**HTTP分块传输编码(Chunked Transfer Encoding)**的内置协议标记:当服务端响应头携带Transfer-Encoding: chunked时,响应体会被拆分为多个数据块分批传输,每个块开头的十六进制字符代表当前块的字节长度,全部块传输完成后会用单独一行的0标识传输结束,你的返回示例符合该特征:
138d {"feeds":[{"pubdate":"Sun, 28 Nov 2021 23:00:00 EST"}]} 0
禁用方法(从根源消除额外字符)
你可以通过服务端配置关闭分块传输编码,不同服务端环境的配置方式如下:
- Nginx:在对应站点的server配置块中添加
chunked_transfer_encoding off;,保存后重启Nginx生效,该配置仅对HTTP/1.1协议生效。 - Node.js(Express/Koa):返回响应时提前计算响应体的总长度,手动设置
Content-Length响应头,服务端会自动关闭分块传输,Express示例代码:
const responseData = JSON.stringify({ feeds: [/* 业务数据 */] }); // 计算响应体字节长度 res.set('Content-Length', Buffer.byteLength(responseData)); res.send(responseData);
- Java(SpringBoot):可在配置文件中添加
spring.servlet.encoding.chunked=false关闭分块传输,也可手动设置响应的Content-Length头实现相同效果。 - PHP:输出响应前关闭输出缓冲并指定Content-Length头,示例代码:
<?php $responseData = json_encode(['feeds' => [/* 业务数据 */]]); header('Content-Length: ' . strlen($responseData)); echo $responseData; ?>
前端兼容方案(无需修改服务端)
如果不便调整服务端配置,也可以在前端对原始响应做内容提取,过滤掉分块传输的标记字符后再解析:
// rawResponse 为Ajax请求拿到的原始响应字符串 const validContent = rawResponse // 移除开头的十六进制长度行和多余空白 .replace(/^[0-9a-fA-F]+\s+/, '') // 移除末尾的结束标记0和多余空白 .replace(/\s+0$/, '') .trim(); // 解析有效JSON数据 const data = JSON.parse(validContent);
内容的提问来源于stack exchange,提问作者Jon Negrite
相关产品推荐
相关产品推荐

