У меня есть ассоциативный массив, который я хочу передать в cURL как данные POST. Однако я пробовал несколько вещей, но это не работает.
Массив:
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) (пример не содержит пример массива переменных). Здесь они упомянули массив переменных (массив хэшей).
нет, не нужно сохранять порядок элементов массива.
Предположения/понимание:
Одна 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 ...)
не понял этот комментарий: # используйте nameref, чтобы мы могли передать имя любого ассоциативного массива
при вызове функции мы передаем имя массива, например, build_data details
; если вы случайно назвали свой массив как-то иначе (например, new_details
), то вызов функции становится build_data new_details
; nameref
просто позволяет нам сопоставить любое имя массива, которое у вас может быть, с локальным именем _arr
... таким образом, функцию не нужно редактировать вручную, чтобы ссылаться на любое имя вашего реального массива i
Можете ли вы обновить свой ответ в соответствии с правкой, которую я внес в вопрос. Часть создания строки работала; но при передаче его в команду cURL он всегда терпит неудачу. Не знаю, что не так.
А также, пожалуйста, предложите, должен ли я сделать это вопросом gitlab или это нормально, как общий вопрос?
@KL_KISNE_DEKHA_HAI что означает always failing
? вы получили сообщение о синтаксисе/ошибке? вы получаете нет / неправильный ответ? что-то другое? что касается вашего последнего обновления ... я не использую gitlab и не понимаю ссылку ... поэтому я не уверен, связано ли / как ваше обновление с этим ответом ... ????
единственное, о чем я могу догадаться, это экранированные кавычки; Я удалил экранированные (одинарные) кавычки и просто заключил вызов функции в двойные кавычки; посмотреть, работает ли это; если это все еще не работает, обновите вопрос, указав фактический / реальный URL-адрес, который вы тестируете; а также включите полный вывод, который вы получаете при запуске моего ответа; для устранения неполадок мне нужна возможность воспроизвести то, что вы видите
Извините, чувак, не могу больше рассказать об этом, это организационная вещь, над которой я работаю, поэтому кроме вопроса больше ничего сказать нельзя. Однако в большинстве случаев ошибка была: «{ошибка: переменные недействительны}». Спасибо в любом случае получил интуицию, основанную на вашем ответе
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 за то, что он дал мне интуитивное представление о создании строки с его логикой выше.
нужно ли добавлять элементы массива в запрос
curl
в том же порядке, как показано, то естьname
, затемclass
, затемsection
, затемsubject
? может ли массив иметь разное количество записей и индексов массива? может ли компонент записи массива - индекс или данные - содержать новые строки?