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

如何在cURL POST请求中传递Bash关联数组作为数据参数?

将Bash关联数组转为GitLab API所需JSON并通过cURL发送POST请求

你需要把Bash关联数组转换成GitLab API创建流水线要求的variables数组格式(每个元素是键值对对象),再用cURL发送POST请求。之前的尝试失败,核心原因是直接传递数组变量无法生成符合要求的JSON结构,且未正确设置请求的Content-Type头。

推荐方案:使用jq工具生成合规JSON

jq是轻量的JSON处理工具,能自动处理特殊字符转义,确保JSON格式完全合规,是最可靠的实现方式。

步骤1:安装jq(若未安装)

大部分Linux发行版可通过包管理器快速安装:

# Debian/Ubuntu 系列
sudo apt install jq

# RHEL/CentOS 系列
sudo dnf install jq

步骤2:关联数组转JSON并发送请求

# 定义你的关联数组
declare -A details
details[name]="Honey"
details[class]="10"
details[section]="A"
details[subject]="maths"

# 生成GitLab API需要的JSON结构
json_data=$(jq -n --argjson vars "$(
  # 遍历数组,生成单个JSON对象后合并为数组
  for key in "${!details[@]}"; do
    echo "{\"$key\": \"${details[$key]}\"}"
  done | jq -s .
)" '{"variables": $vars}')

# 发送POST请求,必须指定Content-Type为application/json
resp=$(curl --request POST \
  --header "Content-Type: application/json" \
  --data "$json_data" \
  "https://somedomain.net/getMarks")

原理说明

  • 内层循环遍历关联数组的所有键,生成{"key": "value"}格式的字符串,再通过jq -s .将这些字符串合并为一个JSON数组。
  • 外层jq把这个数组包裹在variables字段中,生成GitLab API要求的完整JSON结构。
  • 必须添加Content-Type: application/json请求头——GitLab API仅接受JSON格式的请求体,之前的尝试未设置此头,导致服务器无法正确解析数据。

备选方案:手动拼接JSON(不推荐)

如果无法安装jq,可以手动拼接JSON,但这种方式无法处理值中的特殊字符(如引号、反斜杠),仅适用于值无特殊符号的场景:

declare -A details
details[name]="Honey"
details[class]="10"
details[section]="A"
details[subject]="maths"

# 手动构建JSON字符串
json_data='{"variables":['
first_entry=1
for key in "${!details[@]}"; do
  if [ $first_entry -ne 1 ]; then
    json_data+=','
  fi
  json_data+="{\"$key\": \"${details[$key]}\"}"
  first_entry=0
done
json_data+=']}'

# 发送请求
resp=$(curl --request POST \
  --header "Content-Type: application/json" \
  --data "$json_data" \
  "https://somedomain.net/getMarks")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:05:29