Curl avec multiligne de JSON
Envisager la boucle de commande ci-dessous, est-il possible de permettre le retour à la ligne en JSON (sans le rapetisser) et de l'exécuter directement dans bash (Mac/Ubuntu)
curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
'
{
"field1": "test",
"field2": {
"foo": "bar"
}
}'
Lorsque je lance la commande ci-dessus, semble erreur s'est produite lors de la second {
Comment réparer la commande ci-dessus?
Mis à jour: en fait, j'ai été en mesure d'exécuter la commande sans problème auparavant, je ne sais pas pourquoi le problème est arrivé récemment.
- Pouvez-vous nous en dire plus sur l'erreur? Votre exemple fonctionne "comme est" sur mon système.
mymac > bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.
- Yup, fonctionne pour moi aussi:
GNU bash, version 4.3.42(1)-release
- Aussi découvrez le C ANSI comme la syntaxe de la chaîne:
echo $'here is a newline:\nand here is a tab:\t'
application/json
est le type de support correct pour les données JSON -- voir RFC4627
Vous devez vous connecter pour publier un commentaire.
Je me suis souvenu d'une autre façon de le faire avec un "Here Document", comme décrit dans la page de manuel de Bash et détaillé ici. Le
@-
moyens de lire le corps à partir de STDIN, tandis que<< EOF
moyens de canaliser le script contenu jusqu'à ce que "expressions du FOLKLORE" comme STDIN à friser. Cette disposition peut être plus facile à lire que d'utiliser des fichiers séparés ou "l'écho d'une variable" approche.REMARQUE: Utilisez le
--trace <outfile>
curl option pour enregistrer les exactement ce qui se passe sur le fil. Pour une raison quelconque, ce Document approche de bandes de retours à la ligne?!?-d @- << EOF | wc
curl -d
option: curl.haxx.se/docs/man.html#-d. Utilisation--data-binary
de garder saut de ligne et retour chariot caractères.Le long des lignes de Martin suggestion de mettre le JSON dans une variable, vous pouvez également mettre le JSON dans un fichier séparé, et ensuite fournir le nom du fichier à
-d
à l'aide de curl de la syntaxe@:L'inconvénient est évident (2 ou plusieurs fichiers où vous en avez un.) Mais sur le côté positif, votre script peut accepter un nom de fichier ou de répertoire en argument et que vous n'auriez jamais besoin de la modifier, il suffit de lancer sur les différents fichiers JSON. Si c'est utile dépend de ce que vous essayez d'accomplir.
Vous devriez utiliser l'extérieur des guillemets, et l'évasion de tous les intérieur des guillemets comme ceci:
Vous pouvez assigner votre json pour un var:
Maintenant, vous pouvez transmettre l'enroulement à l'aide de
stdin
:${username}
) dans le JSON.@eric-bolinger la raison pour laquelle le Heredoc bandes de retours à la ligne est parce que vous devez dire à votre Heredoc pour conserver les retours à la ligne en citant la EOF:
Avis le seul-tiques expressions du FOLKLORE entourant la première fois qu'il est défini, mais pas la seconde.