You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:33:29