J'essaie de passer la sortie cat
à curl:
$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api
Mais input
est littéralement un -
.
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
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
Essayer
curl --data '{"title":"mytitle","input":"'$(cat file)'-"}' http://api
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.
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
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.