110 votes

Utiliser le pipe pour les données curl

Je suis en train d'essayer de passer la sortie cat à curl :

$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api

Mais input est littéralement un -.

0 votes

Je ne suis pas sûr s'il y a un format spécial ici, sinon voici ce que vous voulez peut-être : serverfault.com/questions/313599/…

219voto

orciny Points 1285

J'ai passé un certain temps à essayer de comprendre cela et j'ai réussi à le faire fonctionner avec le code suivant :

cat data.json | curl -H "Content-Type: application/json" -X POST --data-binary @- http://api

1 votes

Le problème est que le contenu du fichier sera la valeur de input dans les données JSON.

2 votes

Je ne cesse d'oublier le symbole @. :(

7 votes

Vous devez être conscient que -d ignore les caractères \n et \r. C'est pourquoi j'utilise toujours --data-binary.

29voto

Nathan Points 285

Vous pouvez utiliser le fichier stdin magique /dev/stdin

cat data.json | curl -H "Content-Type: application/json" -X POST -d "$(

5 votes

Et si /dev/stdin fait 25 Mo, comme dans mon cas d'utilisation où j'ai besoin de télécharger un fichier de 25 Mo et que 25 Mo de texte base64 sont trop pour que les arguments bash puissent gérer?

2 votes

Faites attention à la substitution de chaînes, en particulier pour les données binaires. Cela peut corrompre subtilement vos données (par exemple, supprimer un saut de ligne en fin de ligne ou tout supprimer après un NUL).

0 votes

Cela fonctionne parfaitement en bash, mais génère une erreur lors de la lecture de /dev/stdin : Erreur d'entrée/sortie en zsh

17voto

Walf Points 885

Si vous souhaitez saisir/coller les données sans les échapper ni polluer votre historique bash, vous pouvez utiliser ceci :

cat | curl --json @- https://api.example/

L'option --json a été ajoutée dans v7.82.0, donc si votre version est plus ancienne, utilisez ceci :

cat | curl --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --data @- \
    https://api.example/

Ces commandes vous placent dans un cat interactif où vous pouvez saisir directement les données, par exemple avec Shift + Insert. Vous terminez avec un retour à la ligne et un Ctrl + D (caractère End-of-Transmission), ce qui signale à cat que vous avez terminé. Ces données sont ensuite transmises à curl, et vous avez une entrée d'historique réutilisable.

15voto

Joe King Points 924

Cela devrait également fonctionner

curl -H "Content-Type: application/json" -d @data.json http://api

Utiliser -d force curl à utiliser implicitement POST pour la requête.

1 votes

Oui! Très bien pour les cas d'utilisation où la taille des données dépasse ce que les arguments bash peuvent gérer.

14voto

Robin A. Meade Points 340
# Créer le fichier d'entrée
echo -n 'Essayer

7 votes

Le commentaire "L'option -d@ indique à curl de lire les données depuis STDIN." était extrêmement utile.

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