web-dev-qa-db-fra.com

Comment PUT un objet JSON avec un tableau en utilisant curl

J'ai une série de données à entrer dans la base de données. L'interface utilisateur permettant de saisir les données ne convient pas à la saisie en bloc. Je tente donc de formuler un équivalent en ligne de commande. Lorsque j'examine la requête réseau de l'interface utilisateur en chrome, je vois une requête PUT d'un objet JSON. Quand j'essaie 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`

Je reçois une erreur 

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

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

Comment puis-je mettre un objet JSON qui comprend un tableau?

80
Miles Libbey

Votre ligne de commande devrait avoir un -d/- data inséré avant la chaîne que vous voulez envoyer dans le PUT, et vous voulez définir le type de contenu 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
123
Daniel Stenberg

Bien que le message d'origine contienne 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 en pos X

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

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

63
Yonik

Il convient de mentionner que l’entête Accept informe le serveur de ce que nous acceptons en retour, alors que l’entête pertinent dans ce contexte est Content-Type

Il est souvent conseillé de spécifier Content-Type en tant que application/json lors de l'envoi de JSON. Pour curl, la syntaxe est la suivante:

-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`
37
mogul

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 [email protected]:123456 -X POST  https://yoururl.com

Ceci en particulier résolu mon erreur erreur de commande curl: mauvais côlon est le premier caractère

1
vibs2006

La seule chose qui a aidé est d’utiliser un fichier JSON au lieu d’un corps de texte json. Basé sur Comment envoyer le contenu d'un fichier en tant qu'entité body à l'aide de cURL

0
Chen