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?

Miles Libbey
la source

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
Daniel Stenberg
la source
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"}}'

Yonik
la source
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`
magnat
la source
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 [email protected]: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

vibs2006
la source