如何在Bash函数中校验curl返回状态码并返回接口响应JSON结果
实现方案
直接给出可用的完整函数实现:
# 全局配置(可放在脚本开头统一管理) API_KEY="替换为你的实际接口密钥" SERVICE_BASE="https://myservice.example.com" function callServer() { local payload="$1" # 支持传入第二个参数自定义请求端点,默认使用根路径,可按需调整默认值 local endpoint="${2:-/}" # 创建临时文件存储响应体,避免污染工作目录 local resp_temp=$(mktemp) local http_code # 发起curl请求:响应体写入临时文件,HTTP状态码输出到标准输出用于校验 http_code=$(curl --request POST \ --url "${SERVICE_BASE}${endpoint}" \ --header "Authorization: ${API_KEY}" \ --header "Content-Type: application/json" \ --data "${payload}" \ -o "${resp_temp}" \ -w "%{http_code}" \ -s) # 状态码校验逻辑 if [[ "${http_code}" != "200" ]]; then # 错误信息输出到标准错误方便排查 echo "请求失败,HTTP状态码:${http_code},错误响应:$(cat "${resp_temp}")" >&2 # 清理临时文件 rm -f "${resp_temp}" # 直接终止整个脚本,返回错误码1 exit 1 fi # 状态码正常则输出响应体,供上层变量捕获 cat "${resp_temp}" rm -f "${resp_temp}" }
使用说明
注意:你原本的变量赋值写法不符合Bash语法,变量名左侧不能加$,函数输出需要用$()捕获,正确用法如下:
# 示例1:请求默认端点,把返回的JSON赋值给变量 getWidgetsJson=$(callServer '{"flim":"flam"}') # 示例2:请求自定义端点 /launch launchMissiles=$(callServer '{"fizz":"buzz","num":50}' '/launch')
关键改动说明
- 把原本包裹变量的单引号改为双引号,确保
$API_KEY、$payload会被Shell正确展开,不会发送字面量字符串 - 通过curl的
-w "%{http_code}"参数原生捕获返回的HTTP状态码,无需额外解析响应 - 状态码非200时直接执行
exit 1,会终止整个脚本运行,符合你的要求 - 响应体输出到标准输出,可直接被变量捕获,无需额外读取本地文件
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

