Comment mettre un objet json avec un tableau en utilisant curl


95

J'ai une série de données à entrer dans la base de données. L'interface utilisateur pour saisir les données n'est pas bonne pour la saisie en bloc, j'essaie donc de formuler un équivalent en ligne de commande. Lorsque j'examine la demande réseau de l'interface utilisateur dans chrome, je vois une demande PUT d'un objet json. Quand j'essaye de répliquer la demande

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`

J'obtiens une erreur

curl: (3) [globbing] accolades imbriquées non prises en charge à la pos X

Où X est la position du caractère du premier "[".

Comment puis-je METTRE un objet json qui comprend un tableau?

Réponses:


148

Votre ligne de commande doit avoir une donnée -d / - insérée avant la chaîne que vous souhaitez envoyer dans le PUT, et vous souhaitez définir le Content-Type et non Accepter.

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

En utilisant les données JSON exactes de la question, la ligne de commande complète deviendrait:

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 car Content-Type (au lieu de Accept) est l'en-tête qui doit être défini dans ce cas.
Goran

4
Pour ceux qui se demandent, [JSON] est simplement un espace réservé pour la chaîne JSON. N'ajoutez pas de crochets supplémentaires autour de votre chaîne JSON.
Mihai Todor

89

Bien que le message original ait eu d'autres problèmes (c'est-à-dire le "-d" manquant), le message d'erreur est plus générique.

curl: (3) [globbing] accolades imbriquées non prises en charge à la pos X

Ceci est dû au fait que les accolades {} et les crochets [] sont des caractères globuleux spéciaux dans curl. Pour désactiver ce globbing, utilisez l' option " -g ".

À titre d'exemple, la requête de facette Solr suivante échouera sans le "-g" pour désactiver le globbing curl : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'


3
C'était la bonne solution pour moi, en utilisant -gtravaillé comme prévu. Merci @Yonik
arjones

2
Mon Dieu, j'ai cherché une solution à mon problème de curl GraphQL et cela m'a aidé. Sauce incroyable.
NetOperator Wibby

39

Il convient de mentionner que l'en- Accepttête dit au serveur quelque chose sur ce que nous acceptons en retour, alors que l'en-tête pertinent dans ce contexte estContent-Type

Il est souvent conseillé de spécifier Content-Typecomme application/jsonlors de l'envoi de JSON. Pour curl, la syntaxe est:

-H 'Content-Type: application/json'

La commande curl complète sera donc:

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

Essayez d'utiliser un guillemet simple au lieu de guillemets doubles avec -g

Le scénario suivant a fonctionné pour moi

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

AVEC

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

Cela a particulièrement résolu mon erreur de commande curl: une mauvaise URL deux points est le premier caractère


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.