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),优化方案如下:
核心改进:
- 日志追加而非覆盖:使用
-a选项配合-o,每次请求的内容追加到日志文件,而非覆盖;若需单独日志,可将LogFile改为动态命名:LogFile="api_check_$(date +%Y%m%d_%H%M%S).log" - 捕获完整调试信息:将curl的stderr(
-v的连接、请求/响应头信息)重定向到日志(2>>"${LogFile}"),日志中同时包含响应体和调试详情 - 直接获取状态码:通过
$("$@" ...)捕获-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
相关产品推荐
相关产品推荐

