Search code examples
bashshellcurlpostgitlab-api

Pass Associative Array as Data Param in POST request using cURL


I have an associative array that I want to pass to cURL as POST data. However i have tried multiple things, still it doesn't work.

The array:

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

The cURL commands have tried so far (all of these failed):

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")   

Something like shown below, I want the above request to be (indirectly), however I want to pass the array directly instead of writing its contents.

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

Please note that to begin with I will always have the associative array ONLY (not any json array or string).

This question rose when I was trying calling cURL command with the associative array as on this link (GITLAB API)(the example does not contain variables array example). Here they have mentioned a variables array (array of hashes).


Solution

    1. Since I had to use an older version of bash, which does not involve the name referencing as stated on the answer, I had to try to code string creation of the associative array without passing it to a function
    2. Since I always had an associative array to begin with, the process of passing the array as accepted by the gitlab API normally was:
    resp=$(cURL --request POST --data '{"variables":[{"name": "Honey"},{"class": "10"},{"section": "A"},{"subject": "maths"}]}' "https://somedomain.net/getMarks")
    

    OR

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

    So tried some tweaks on the second way and what worked for me was:

    _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")
    

    And it was a success. Thanks to @markp-fuso for giving me an intuition of creating a string with his logic above.