Як ВСТАНОВИТИ 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) [глобування] вкладені фігурні дужки не підтримуються в позиції X

Де X - позиція символу першого "[".

Як я можу ПОСТАВИТИ json-об'єкт, що включає масив?

Відповіді:


148

Ваш командний рядок повинен містити -d / - дані, вставлені перед рядком, який потрібно надіслати в PUT, і ви хочете встановити тип вмісту, а не 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) - це заголовок, який слід встановити в цьому випадку.
Горан

4
Для тих, хто цікавиться, [JSON] - це просто заповнювач для рядка JSON. Не додавайте зайвих квадратних дужок навколо вашого рядка JSON.
Mihai Todor

89

Хоча у вихідної публікації були й інші проблеми (тобто відсутні "-d"), повідомлення про помилку є більш загальним.

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

Це пов’язано з тим, що фігурні дужки {} та квадратні дужки [] - це спеціальні символи, що поглинають кучері. Щоб вимкнути цю глобалізацію, використовуйте опцію " -g ".

Як приклад, наступний запит фасету Solr буде невдалим, якщо "-g" не вимкне глобулювання curl : 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як 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-адреса двокрапки - це перший символ


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.