web-dev-qa-db-fra.com

utiliser un tuyau pour les données curl

J'essaie de passer la sortie cat à curl:

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

Mais input est littéralement un -.

24
Jürgen Paul

J'ai passé un certain temps à essayer de comprendre cela et je l'ai fait fonctionner avec les éléments suivants:

cat data.json | curl -H "Content-Type: application/json" -X POST -d @- http://api
59
Tom Jowitt

Vous pouvez utiliser le fichier stdin magique /dev/stdin

cat data.json | curl -H "Content-Type: application/json" -X POST -d "$(</dev/stdin)" http://api
12
Nathan

Essayer

curl --data '{"title":"mytitle","input":"'$(cat file)'-"}' http://api
8
golimar

Cela devrait aussi marcher 

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

L'utilisation de -d oblige curl à utiliser implicitement POST pour la requête.

5
Joe King

Documentation Curl pour l'option -d

Si vous démarrez les données avec la lettre @, le reste doit être un nom de fichier pour lire les données ou - si vous souhaitez que curl lise les données depuis stdin. Plusieurs fichiers peuvent également être spécifiés. L'enregistrement de données à partir d'un fichier nommé 'foobar' se ferait donc avec -d, --data @foobar. Quand on dit à --data de lire un fichier comme celui-ci, les retours à la ligne et les nouvelles lignes seront supprimés. Si vous ne voulez pas que le caractère @ ait une interprétation spéciale, utilisez plutôt --data-raw. 

En fonction de votre terminal HTTP, de la configuration du serveur, vous devriez utiliser ce format:

curl -d @data.json http://api

3
richerlariviere

On dirait que vous voulez envelopper le contenu de input dans un corps JSON, puis l'envoyer avec une demande POST. Je pense que le moyen le plus simple de le faire est de manipuler stdin en premier, puis de le pousser à curl en utilisant -d @-. Une façon pourrait ressembler à ceci:

cat <(echo '{"title":"mytitle","input":"') file <(echo '"}') \
| curl -d @- http://api

J'utilise <(echo) pour utiliser cat pour fusionner des chaînes et des fichiers, mais il existe certainement un meilleur moyen.

Gardez à l'esprit que cela n'échappe pas au contenu de file et que vous pourriez rencontrer des problèmes à cause de cela.

0
zneak