Передать ассоциативный массив в качестве параметра данных в запросе POST с использованием cURL

У меня есть ассоциативный массив, который я хочу передать в 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) (пример не содержит пример массива переменных). Здесь они упомянули массив переменных (массив хэшей).

нужно ли добавлять элементы массива в запрос curl в том же порядке, как показано, то есть name, затем class, затем section, затем subject? может ли массив иметь разное количество записей и индексов массива? может ли компонент записи массива - индекс или данные - содержать новые строки?

markp-fuso 06.11.2022 16:01

нет, не нужно сохранять порядок элементов массива.

KL_KISNE_DEKHA_HAI 06.11.2022 16:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предположения/понимание:

  • нет необходимости перечислять элементы массива в каком-либо определенном порядке
  • ни индексы массива, ни значения не содержат новых строк

Одна 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-адреса я немного догадываюсь о том, принадлежат ли/где экранированные кавычки, поэтому, возможно, потребуется настроить экранированные кавычки, чтобы правильно работать

не понял этот комментарий: # используйте nameref, чтобы мы могли передать имя любого ассоциативного массива

KL_KISNE_DEKHA_HAI 06.11.2022 16:30

при вызове функции мы передаем имя массива, например, build_data details; если вы случайно назвали свой массив как-то иначе (например, new_details), то вызов функции становится build_data new_details; nameref просто позволяет нам сопоставить любое имя массива, которое у вас может быть, с локальным именем _arr ... таким образом, функцию не нужно редактировать вручную, чтобы ссылаться на любое имя вашего реального массива i

markp-fuso 06.11.2022 16:53

Можете ли вы обновить свой ответ в соответствии с правкой, которую я внес в вопрос. Часть создания строки работала; но при передаче его в команду cURL он всегда терпит неудачу. Не знаю, что не так.

KL_KISNE_DEKHA_HAI 07.11.2022 21:01

А также, пожалуйста, предложите, должен ли я сделать это вопросом gitlab или это нормально, как общий вопрос?

KL_KISNE_DEKHA_HAI 07.11.2022 21:04

@KL_KISNE_DEKHA_HAI что означает always failing? вы получили сообщение о синтаксисе/ошибке? вы получаете нет / неправильный ответ? что-то другое? что касается вашего последнего обновления ... я не использую gitlab и не понимаю ссылку ... поэтому я не уверен, связано ли / как ваше обновление с этим ответом ... ????

markp-fuso 07.11.2022 21:32

единственное, о чем я могу догадаться, это экранированные кавычки; Я удалил экранированные (одинарные) кавычки и просто заключил вызов функции в двойные кавычки; посмотреть, работает ли это; если это все еще не работает, обновите вопрос, указав фактический / реальный URL-адрес, который вы тестируете; а также включите полный вывод, который вы получаете при запуске моего ответа; для устранения неполадок мне нужна возможность воспроизвести то, что вы видите

markp-fuso 07.11.2022 21:38

Извините, чувак, не могу больше рассказать об этом, это организационная вещь, над которой я работаю, поэтому кроме вопроса больше ничего сказать нельзя. Однако в большинстве случаев ошибка была: «{ошибка: переменные недействительны}». Спасибо в любом случае получил интуицию, основанную на вашем ответе

KL_KISNE_DEKHA_HAI 08.11.2022 19:14
Ответ принят как подходящий
  1. Так как мне пришлось использовать более старую версию bash, которая не включает ссылка на имя, как указано в ответе, мне пришлось попытаться строка кода создание ассоциативного массива без передачи его в функцию
  2. Поскольку у меня всегда был ассоциативный массив для начала, процесс передачи массива, принятого API gitlab, обычно был следующим:
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 за то, что он дал мне интуитивное представление о создании строки с его логикой выше.

Другие вопросы по теме