Как поместить объект json в массив с помощью curl

95

У меня есть ряд данных для ввода в базу данных. Пользовательский интерфейс для ввода данных не подходит для массового ввода, поэтому я пытаюсь сформулировать эквивалент командной строки. Когда я просматриваю сетевой запрос пользовательского интерфейса в Chrome, я вижу запрос PUT объекта json. Когда я пытаюсь повторить запрос

curl -H 'Accept: application/json' -X PUT '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

Я получаю ошибку

curl: (3) [globbing] вложенные фигурные скобки не поддерживаются в позиции X

Где X - позиция символа первого "[".

Как я могу ПОСТАВИТЬ объект json, который включает в себя массив?

Майлз Либби
источник

Ответы:

148

В вашей командной строке должен быть -d / - данные, вставленные перед строкой, которую вы хотите отправить в PUT, и вы хотите установить Content-Type, а не Accept.

curl -H 'Content-Type: application/json' -X PUT -d '[JSON]' http://example.com/service

Используя точные данные JSON из вопроса, полная командная строка будет выглядеть так:

curl -H 'Content-Type: application/json' -X PUT \
-d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' \
http://example.com/service
Даниэль Стенберг
источник
4
-1, потому что Content-Type (вместо Accept) - это заголовок, который должен быть установлен в этом случае.
Goran
4
Для тех, кому интересно, [JSON] - это просто заполнитель для строки JSON. Не добавляйте лишние квадратные скобки в строку JSON.
Михай Тодор
90

Хотя в исходном сообщении были другие проблемы (например, отсутствовал "-d"), сообщение об ошибке более общее.

curl: (3) [globbing] вложенные фигурные скобки не поддерживаются в позиции X

Это потому, что фигурные скобки {} и квадратные скобки [] - это специальные символы подстановки в curl. Чтобы отключить это подстановку, используйте параметр « -g ».

Например, следующий запрос фасета Solr завершится ошибкой без «-g» для отключения подстановки локонов : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'

Йоник
источник
3
Это было правильное решение для меня, использование -gсработало, как ожидалось. Спасибо @Yonik
arjones
2
Боже мой, я искал решение моей проблемы с завитками GraphQL, и это мне помогло. Awesomesauce.
NetOperator Wibby
39

Следует отметить, что Acceptзаголовок сообщает серверу что-то о том, что мы принимаем обратно, тогда как соответствующий заголовок в этом контекстеContent-Type

Часто рекомендуется указывать Content-Type as application/jsonпри отправке JSON. Для curl синтаксис:

-H 'Content-Type: application/json'

Итак, полная команда curl будет такой:

curl -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`
магнат
источник
2

Попробуйте использовать одинарную кавычку вместо двойных кавычек вместе с -g

Для меня сработал следующий сценарий

curl -g -d '{"collection":[{"NumberOfParcels":1,"Weight":1,"Length":1,"Width":1,"Height":1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

С УЧАСТИЕМ

curl -g -d "{'collection':[{'NumberOfParcels':1,'Weight':1,'Length':1,'Width':1,'Height':1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

Это особенно решило мою ошибку: ошибка команды curl: неверный URL-адрес - первый символ

вибрации2006
источник