C'est la meilleure façon de le faire. L'alternative d'utiliser -d @message.txtcomme suggéré dans l'autre réponse en particulier peut modifier vos sauts de ligne. --data-binaryd'autre part ne le sera pas (ce qui est important si vous devez conserver vos sauts de ligne CRLF pour multipart / form-data, voir: stackoverflow.com/questions/10765243/… )
William Denniss
9
Parce que cela m'a pris une seconde: si vous téléchargez un fichier, vous voudrez probablement utiliser un sous-shell pour celacurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
Je n'ai pas pu faire fonctionner --data-binary mais j'ai pu utiliser la réponse du caractère% 0A (voir @malcolmocean). Lorsque j'utilise --data-binary "ip = 33.44.55. * \ N5.6.7.8" il ne le traite pas comme une nouvelle ligne, mais --data "" ip = 33.44.55. *% 0A5.6.7.8 "envoie la nouvelle ligne
Paul
51
Votre shell passe \suivi par nplutôt qu'une nouvelle ligne à boucler plutôt que "my message\n". Bash prend en charge une autre syntaxe de chaîne qui prend en charge les séquences d'échappement telles que \net \t. Pour l'utiliser, commencez la chaîne par $'et terminez la chaîne par ':
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Cela a fonctionné pour moi aussi. Je vais devoir jouer avec, car cela ne fonctionnait pas avec des guillemets doubles, ce qui signifie que je ne peux pas utiliser de guillemets simples dans la chaîne.
Tyler Collier du
1
Je ne sais pas d'où vous avez eu cette idée qu'il s'agit de "syntaxe du shell JavaScript". Le shell passe my message\nmot pour mot, pas avec deux échappements comme vous le dites.
Chris Down
@ChrisDown, vous m'avez mal cité. J'ai dit "syntaxe de chaîne JavaScript", pas "syntaxe de shell JavaScript". J'utilise la syntaxe de chaîne JavaScript pour être clair sur ce que je veux dire avec mes exemples de chaînes. Je pense que ce à quoi vous faites référence my message\nest le même que ce à quoi je fais référence "my message\n".
Benjamin Atkin
2
@BenAtkin Désolé, glissement freudien. Cependant, ma lecture était toujours correcte. \nn'a rien à voir avec JavaScript. En fait, rien ici n'a rien à voir avec JavaScript.
Chris Down
Je l'utilise pour l'expliquer aux gens. Et cela semble avoir fonctionné. La syntaxe des chaînes Shell n'est pas largement comprise. Si c'était le cas, pourquoi cette question aurait-elle été posée? Que devrais-je utiliser pour l'expliquer?
Benjamin Atkin
16
Il existe un moyen beaucoup plus simple!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Cela utilisera la citation ANSI-C pour insérer le caractère de nouvelle ligne.
J'ai du mal à comprendre cela. J'obtiens que @c'est pour indiquer un nom de fichier, mais y a-t-il une signification particulière lors de l'utilisation @-? Que <<EOFfais-tu?
Dennis T --Reinstate Monica--
1
@-dit à curl de consommer les entrées du standard in, et <<EOFest l'indicateur de fin de flux pour bash. Nous utilisons ensuite le mot magique EOFdans la charge utile de données pour dire à bash que nous avons fini d'écrire dans le flux.
Jammer
De plus, -c'est une sorte de méthode standard dans GNU / Linux pour spécifier STDIN lorsqu'un nom de fichier est attendu. Ce n'est pas universel, mais c'est assez courant.
Rich Remer
En consultant le manuel, nous voyons qu'il devrait être juste - et non @ -
user3504575
8
(Je me suis retrouvé ici avec une question légèrement différente, donc je vais juste poster ma réponse car cela pourrait aider les futurs explorateurs)
Ma solution s'applique aux personnes qui envoient des données de type formulaire, c'est-à-dire des paires clé / valeur dans une chaîne de requête. Utilisez le saut de ligne codé, qui %0Aressemble à la façon dont un espace codé est %20. Vous pouvez utiliser http://meyerweb.com/eric/tools/dencoder/ pour convertir d'autres symboles.
Donc, si vous souhaitez définir la clé messagesur la valeur:
commentaire mineur (peut-être une faute de frappe) pour un caractère de retour de saut de ligne / carraige, il devrait être% 0A plutôt que% A0
Paul
8
Eu un problème similaire. Lors du téléchargement du fichier csv du Mac vers le stockage en nuage, de nouvelles lignes ont été supprimées. Après l'avoir téléchargé, le fichier entier ressemblait à une seule ligne. J'ai essayé d'ajouter différents caractères EOL '\ n' '\ r' '\ r \ n' sans succès. L'utilisation de '--data-binary' au lieu de '-d' a résolu le problème. Btw ce problème s'est produit uniquement à partir de Mac. «-d» a très bien fonctionné lors de l'appel depuis la machine CentOS. Cela ressemble beaucoup au caractère de nouvelle ligne de Mac. Mais n'ayez plus envie de déboguer.
Merci beaucoup pour votre aide.
curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"
CONTRE
curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"
Merci beaucoup ! Ce n'est pas lié à votre Mac: j'avais exactement le même problème sous Linux, et l'utilisation --data-binary @a résolu mon problème (envoyer un fichier .ics multiligne à un serveur CalDAV).
M-Jack
3
Ce n'est pas une réponse à votre question, mais je la contournerais en créant un fichier temporaire contenant le message et le saut de ligne, et en donnant à curl ce fichier sur lequel travailler:
curl -X PUT -d @message.txt http://localhost:8000/hello
Si vous commencez les données par la lettre @, le reste doit être un nom de fichier à partir duquel lire les données, ou - si vous voulez que curl lise les données depuis stdin. Le contenu du fichier doit déjà être encodé en URL. Plusieurs fichiers peuvent également être spécifiés. La publication de données à partir d'un fichier nommé 'foobar' se ferait donc avec --data @foobar.
L'utilisation de fichiers temporaires est une approche pratique. Selon la réponse de Szocske, --data-binaryest une alternative plus fidèle à -d, car elle enverra les données textuellement.
William Denniss
7
-1; L'utilisation d'un fichier temporaire avec -d @/path/to/temp/file.txtne résout PAS le problème de saut de ligne. --data-binaryfait, voir ci-dessus.
Frank Olschewski
Si vous voyez cela parce que vous vous demandez pourquoi vos commandes curl ne fonctionnent pas après la mise à niveau de curl ou la mise à niveau vers Windows 10, assurez-vous d'ajouter des guillemets autour de votre référence de fichier. Par exemple: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Mes scripts de reconstruction elasticsearch avaient cessé de fonctionner.
joezen777
3
Un moyen très simple, il suffit de Shift-Enter dans la console pour la pause. Très lisible en le tapant aussi.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
\n\na travaillé dans Gmail, mais a \nété ignoré. J'ai essayé de doubler l'évasion et d'autres suggestions. J'ai également essayé \r\net cela ne fonctionnait pas non plus dans Gmail. Remarque: je n'ai pas pris la peine de tester d'autres clients de messagerie, c'était peut-être un problème spécifique à Gmail.
Finalement, j'ai abandonné la recherche d'une solution et j'ai basculé les balises text/plainà text/htmlet juste utilisé <br />.
Quelqu'un a suggéré que Sendgrid convertisse le texte brut en HTML si vous avez activé un pixel de suivi, ce qui est logique. Peut-être que les nouvelles lignes ont été détruites dans le processus de conversion du texte brut en html. Je suppose que le client veut un pixel de suivi, alors j'ai décidé de passer au HTML.
Réponses:
Parfois, vous souhaitez fournir les données à envoyer textuellement.
L'
--data-binary
option fait cela.la source
-d @message.txt
comme suggéré dans l'autre réponse en particulier peut modifier vos sauts de ligne.--data-binary
d'autre part ne le sera pas (ce qui est important si vous devez conserver vos sauts de ligne CRLF pour multipart / form-data, voir: stackoverflow.com/questions/10765243/… )curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
curl --data-binary @/path/to/file.txt http://example.com/target
Votre shell passe
\
suivi parn
plutôt qu'une nouvelle ligne à boucler plutôt que"my message\n"
. Bash prend en charge une autre syntaxe de chaîne qui prend en charge les séquences d'échappement telles que\n
et\t
. Pour l'utiliser, commencez la chaîne par$'
et terminez la chaîne par'
:Voir Citations ANSI-C dans le manuel de référence de Bash
la source
my message\n
mot pour mot, pas avec deux échappements comme vous le dites.my message\n
est le même que ce à quoi je fais référence"my message\n"
.\n
n'a rien à voir avec JavaScript. En fait, rien ici n'a rien à voir avec JavaScript.Il existe un moyen beaucoup plus simple!
Cela utilisera la citation ANSI-C pour insérer le caractère de nouvelle ligne.
Pas de tuyauterie, pas de fichiers de données. Voir aussi Envoi de nouvelles lignes avec cURL .
la source
La solution pour quelqu'un qui ne veut pas utiliser de fichiers et qui ne veut pas recourir à la magie échappant au shell est:
Mais il s'agit de retours à la ligne littéraux dans la charge utile des données de publication, et non dans les champs de formulaire.
la source
@
c'est pour indiquer un nom de fichier, mais y a-t-il une signification particulière lors de l'utilisation@-
? Que<<EOF
fais-tu?@-
dit à curl de consommer les entrées du standard in, et<<EOF
est l'indicateur de fin de flux pour bash. Nous utilisons ensuite le mot magiqueEOF
dans la charge utile de données pour dire à bash que nous avons fini d'écrire dans le flux.-
c'est une sorte de méthode standard dans GNU / Linux pour spécifier STDIN lorsqu'un nom de fichier est attendu. Ce n'est pas universel, mais c'est assez courant.(Je me suis retrouvé ici avec une question légèrement différente, donc je vais juste poster ma réponse car cela pourrait aider les futurs explorateurs)
Ma solution s'applique aux personnes qui envoient des données de type formulaire, c'est-à-dire des paires clé / valeur dans une chaîne de requête. Utilisez le saut de ligne codé, qui
%0A
ressemble à la façon dont un espace codé est%20
. Vous pouvez utiliser http://meyerweb.com/eric/tools/dencoder/ pour convertir d'autres symboles.Donc, si vous souhaitez définir la clé
message
sur la valeur:vous enverriez
la source
Eu un problème similaire. Lors du téléchargement du fichier csv du Mac vers le stockage en nuage, de nouvelles lignes ont été supprimées. Après l'avoir téléchargé, le fichier entier ressemblait à une seule ligne. J'ai essayé d'ajouter différents caractères EOL '\ n' '\ r' '\ r \ n' sans succès. L'utilisation de '--data-binary' au lieu de '-d' a résolu le problème. Btw ce problème s'est produit uniquement à partir de Mac. «-d» a très bien fonctionné lors de l'appel depuis la machine CentOS. Cela ressemble beaucoup au caractère de nouvelle ligne de Mac. Mais n'ayez plus envie de déboguer.
Merci beaucoup pour votre aide.
CONTRE
la source
--data-binary @
a résolu mon problème (envoyer un fichier .ics multiligne à un serveur CalDAV).Ce n'est pas une réponse à votre question, mais je la contournerais en créant un fichier temporaire contenant le message et le saut de ligne, et en donnant à curl ce fichier sur lequel travailler:
À partir du manuel :
la source
--data-binary
est une alternative plus fidèle à-d
, car elle enverra les données textuellement.-d @/path/to/temp/file.txt
ne résout PAS le problème de saut de ligne.--data-binary
fait, voir ci-dessus.Un moyen très simple, il suffit de Shift-Enter dans la console pour la pause. Très lisible en le tapant aussi.
Faites ceci pour supprimer le saut de ligne:
la source
J'utilisais Sendgrid avec ce code (copié ci-dessous) trouvé à l'origine ici https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
a travaillé dans Gmail, mais a\n
été ignoré. J'ai essayé de doubler l'évasion et d'autres suggestions. J'ai également essayé\r\n
et cela ne fonctionnait pas non plus dans Gmail. Remarque: je n'ai pas pris la peine de tester d'autres clients de messagerie, c'était peut-être un problème spécifique à Gmail.Finalement, j'ai abandonné la recherche d'une solution et j'ai basculé les balises
text/plain
àtext/html
et juste utilisé<br />
.Quelqu'un a suggéré que Sendgrid convertisse le texte brut en HTML si vous avez activé un pixel de suivi, ce qui est logique. Peut-être que les nouvelles lignes ont été détruites dans le processus de conversion du texte brut en html. Je suppose que le client veut un pixel de suivi, alors j'ai décidé de passer au HTML.
la source