it-swarm.com.ru

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

У меня есть ряд данных для ввода в базу данных. Пользовательский интерфейс для ввода данных не подходит для массового ввода, поэтому я пытаюсь сформулировать эквивалент командной строки. Когда я проверяю сетевой запрос пользовательского интерфейса в 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) вложенные фигурные скобки не поддерживаются в позиции X

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

Как я могу положить объект JSON, который включает в себя массив?

80
Miles Libbey

В вашей командной строке должны быть вставлены -d/- data перед строкой, которую вы хотите отправить в 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
123
Daniel Stenberg

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

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

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

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

63
Yonik

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

Часто рекомендуется указывать Content-Type как 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`
37
mogul

Единственное, что помогло - это использовать файл JSON вместо основного текста json. Основано на Как отправить содержимое файла в виде тела объекта с помощью cURL

0
Chen