Curl添加Keep-Alive请求头后报Invalid numeric literal解析错误求排查
Curl请求添加Keep-Alive头后触发JSON解析错误排查
错误本质
parse error: Invalid numeric literal at line 1, column 7 不是curl抛出的错误,是后续使用jq等JSON解析工具读取curl输出的out.json时触发的,核心原因是curl写入目标文件的内容不是合法JSON,混入了非JSON格式的内容。
具体触发原因
- 原有curl命令的Header参数存在语法隐患:
-H Content-Type: application/json、-H Accept: application/json两个Header的值未加引号包裹,shell解析时遇到特殊字符、空格会出现参数拆词错位。之前命令能正常运行属于巧合,新增Keep-Alive相关Header后,参数解析顺序错乱,导致curl将响应头、错误提示等内容混入响应体写入输出文件。 - 命令使用
-s静默模式且未添加失败校验参数:curl默认即使遇到HTTP错误、连接中断、响应截断,也会将所有接收到的内容(包括半截响应、网关错误页、协议提示信息)写入重定向的目标文件,不会主动提示请求失败。你遇到的60秒断连问题本质是连接被中间节点掐断,加了不被服务端认可的Keep-Alive头后,连接更早出现异常截断,返回的半截内容自然无法被JSON解析器识别。 - 额外说明:HTTP层的
Connection: keep-alive是HTTP/1.1的默认行为,手动添加该头、设置timeout=90只是客户端单方面声明,无法约束服务端、中间网关、操作系统的TCP超时策略,根本解决不了60秒断连的问题。
修复方案
- 修正所有Header的写法,所有包含空格的Header值统一用双引号包裹,避免shell拆词导致参数错位。
- 给curl添加
-fS参数:-f参数会让curl在HTTP状态码≥400、连接异常中断时直接返回错误码,不输出非法响应内容;-S参数会在静默模式下保留错误日志打印,方便排查问题,避免错误内容混入输出的JSON文件。 - 修正后的基础可用命令如下:
curl -fS -X POST \ -u "$regressionTestAuthToken" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -H "Connection: keep-alive" \ -H "Keep-Alive: timeout=90, max=100" \ "$URL" \ -d @"${WORKSPACE}/tmp.json" > "${WORKSPACE}/out.json"
- 针对最初的60秒TCP超时问题,不要依赖HTTP层Keep-Alive头解决,按以下方式处理:
- 先去掉输出重定向、加
-v参数跑命令,查看完整连接日志,确认60秒断连的触发点:如果是API网关、负载均衡、本地网络设备的空闲连接超时为60秒,要么联系运维调整对应节点的超时配置,要么将长耗时接口改为异步回调模式,避免同步等待超过60秒。 - 显式配置curl的TCP层保活和超时参数:添加
--max-time 120将curl全局请求超时设为120秒,添加--keepalive-time 30让curl每30秒发送一次TCP保活探测包,避免中间设备因连接空闲掐断链路,这个配置比手动加HTTP层Keep-Alive头的实际效果好得多。
- 先去掉输出重定向、加
- 快速定位当前非法内容的方法:去掉
-s参数、去掉输出重定向直接跑命令,查看终端打印的前几行内容,就能看到混入的非JSON内容(大概率是连接错误提示、半截响应、网关报错页)。
内容的提问来源于stack exchange,提问作者saravana kumar
相关产品推荐
相关产品推荐

