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

Curl函数获取HTTP状态码与详细日志的问题及优化咨询

API检查脚本问题解决方案

问题1:含特殊字符/换行的curl命令执行失败修复

原函数通过字符串拼接执行命令的方式,会导致bash重新解析参数,破坏带空格、@、换行的参数格式(比如-d后的JSON字符串)。正确的做法是直接传递参数数组,保留原始参数结构:

# 可根据需求调整全局变量,或改为函数参数传入
timeout_sec=10
LogFile="api_check.log"

function exec_cmd() {
    # 打印完整命令(保留原始参数格式)
    echo "curl command:" "$*"
    # 直接执行传入的参数数组,避免字符串解析错误
    status_code=$("$@" --max-time "${timeout_sec}" -o "${LogFile}" -a -w '%{http_code}\n' -S 2>>"${LogFile}")
    echo "status_code:${status_code}"
}

关键修复点:

  • 放弃cmd=$@这种字符串存储方式,直接用"$@"执行命令,bash会原样保留每个参数的格式,不会拆分带特殊字符的JSON参数
  • 注意原curl命令中的-x put是拼写错误,应改为-X PUT(大写X指定HTTP请求方法),否则会被curl解析为代理地址,导致请求失败

问题2:同时保留状态码与详细响应日志的优化

原脚本会覆盖日志,且未捕获curl的调试信息(-v输出在stderr),优化方案如下:

核心改进:

  1. 日志追加而非覆盖:使用-a选项配合-o,每次请求的内容追加到日志文件,而非覆盖;若需单独日志,可将LogFile改为动态命名:LogFile="api_check_$(date +%Y%m%d_%H%M%S).log"
  2. 捕获完整调试信息:将curl的stderr(-v的连接、请求/响应头信息)重定向到日志(2>>"${LogFile}"),日志中同时包含响应体和调试详情
  3. 直接获取状态码:通过$("$@" ...)捕获-w输出的HTTP状态码,无需额外处理

调用示例(已修正拼写错误):

# curl命令#2(含@的JSON参数)
exec_cmd curl -v -X PUT <LBFrontIP/ApiEndpoint2> -H 'Content-Type:application/json; charset=utf-8' -H 'Host:<HostName>' -d '{"sbSystemId":"XXXX", "email":"XXX@example.com", "PhoneNo":"99999999999"}'

# curl命令#3(多行JSON参数)
exec_cmd curl -v -X PUT <LBFrontIP/ApiEndpoint3> -H 'Content-Type:application/json; charset=utf-8' -H 'Host:<HostName>' -d '
{
    "ID1": "XXXXX",
    "ID2": "1q2w3e4r5t",
    "applyNo": "00db182faef74e779ca958681127bcec",
    "docLiveScore": "0.1391"
}'

内容的提问来源于stack exchange,提问作者Sachiko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:25:38