113 votes

Comment placer 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 n'est pas adaptée à la saisie en masse. J'essaie donc de formuler un équivalent en ligne de commande. Lorsque j'examine la requête réseau de l'interface utilisateur dans chrome, je vois une requête PUT d'un objet json. Lorsque j'essaie de répliquer la requête

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] les accolades imbriquées ne sont pas supportées à la position X

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

Comment puis-je PUT un objet json qui inclut un tableau ?

167voto

Daniel Stenberg Points 9116

Votre ligne de commande devrait comporter un -d/--data inséré avant la chaîne que vous voulez envoyer dans le PUT, et vous voulez définir le Content-Type et non Accept.

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

Remarque : les données JSON sont enveloppées uniquement pour des raisons de lisibilité, elles ne sont pas valables pour les données de l'UE. curl demande.

104voto

Yonik Points 301

Bien que l'article original présente d'autres problèmes (par exemple, l'absence de "-d"), le message d'erreur est plus général.

curl : (3) [globbing] les accolades imbriquées ne sont pas supportées à la position X

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

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

40voto

mogul Points 1325

Il convient de mentionner que le Accept indique au serveur ce que nous acceptons en retour, alors que l'en-tête pertinent dans ce contexte est le suivant Content-Type

Il est souvent conseillé de préciser Content-Type comme application/json lors de l'envoi de JSON. Pour curl, la syntaxe est :

-H 'Content-Type: application/json'

Donc la commande curl complète sera :

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`

3voto

Chen Points 40

La seule chose qui m'a aidé est d'utiliser un fichier JSON au lieu du corps de texte json. Basé sur Comment envoyer le contenu d'un fichier comme entité du corps à l'aide de cURL ?

2voto

vibs2006 Points 2150

Essayez d'utiliser un devis unique au lieu de guillemets doubles, ainsi que -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

Ceci est particulièrement résolu mon erreur erreur de commande curl : mauvaise url, les deux-points sont le premier caractère

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X