使用cURL将关联数组作为POST请求中的数据参数传递

dw1jzc5e  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(151)

我有一个关联数组,我想把它作为POST数据传递给cURL。但是我已经尝试了很多方法,仍然没有效果。

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

到目前为止,cURL命令已尝试(* 所有这些命令都失败 *):

resp = $(cURL --request POST --data details "https://somedomain.net/getMarks")
resp = $(cURL --request POST --data variables=details "https://somedomain.net/getMarks")
resp = $(cURL --request POST --data "variables=$details" "https://somedomain.net/getMarks") 
resp = $(cURL --request POST --data "variables=${details}" "https://somedomain.net/getMarks") 
resp = $(cURL --request POST --data $details "https://somedomain.net/getMarks") 
resp = $(cURL --request POST --data ${details} "https://somedomain.net/getMarks") 
resp = $(cURL --request POST --data variables=details "https://somedomain.net/getMarks")

如下所示,我希望上面的请求是(间接),但我希望直接传递数组,而不是写入其内容。

resp = $(cURL --request POST --data '{"variables":[{"name": "Honey"},{"class": "10"},{"section": "A"},{"subject": "maths"}]}' "https://somedomain.net/getMarks")

请注意,开始,我将始终只拥有关联数组(而不是任何json数组或字符串)。
这个问题出现在我尝试调用cURL命令与关联数组在这个链接(GITLAB API)(例子 * 不包含 * 变量数组的例子).这里他们提到了一个变量数组(哈希数组).

cfh9epnr

cfh9epnr1#

1.由于我必须使用旧版本的bash,它不涉及答案中所述的名称引用,因此我必须尝试编写关联数组的字符串创建代码,而不将其传递给函数
1.因为我总是有一个以开始的关联数组,所以传递gitlab API所接受的数组的过程通常是:

resp=$(cURL --request POST --data '{"variables":[{"name": "Honey"},{"class": "10"},{"section": "A"},{"subject": "maths"}]}' "https://somedomain.net/getMarks")

resp=$(cURL --request POST --data "variables[name]=Honey" --data "variables[class]=10" --data "variables[section]=A" --data "variables[subject]=maths" "https://somedomain.net/getMarks")

因此,我尝试了第二种方法的一些调整,对我有效的是:

_sep=""
_string=""

for index in "${!details[@]}"
do
    _string="${_string}${_sep}variables[${index}]="${details[$index]}"
    _sep="&"
done

resp=$(cURL --request POST --data "$_string" "https://somedomain.net/getMarks")

#which indirectly was:
resp=$(cURL --request POST --data "variables[name]=Honey&variables[class]=10&variables[section]=A&variables[subject]=maths" "https://somedomain.net/getMarks")

感谢@markp-fuso给了我一个直觉,让我用他的逻辑创建了一个字符串。

wtzytmuj

wtzytmuj2#

假设/理解:

  • 不需要以任何特定顺序列出数组条目
  • 数组索引或值都不包含换行符

一个bash创意:

# use a function to build the --data component

build_data() {
    local -n _arr="$1"                       # use nameref so we can pass in the name of any associative array
    local    _sep=""
    local    _string='{"variables":['
    local    _i

    for i in "${!_arr[@]}"
    do
        _string="${_string}${_sep}{\"${i}\": \"${_arr[$i]}\"}"
        _sep=","
    done

    printf "%s]}" "${_string}"
}

将以下内容添加到curl调用中:

resp=$(cURL --request POST --data "$(build_data details)" "https://somedomain.net/getMarks")

备注:

  • =的两边都不允许有空格,即resp = $(curl ...)必须是resp=$(curl ...)
  • 如果没有实际/有效的URL,我猜测转义引号是否属于/属于哪里,因此可能需要调整转义引号以正确工作

相关问题