Esta es la mejor manera de hacerlo. La alternativa de usar -d @message.txtcomo se sugiere en la otra respuesta en particular puede alterar sus saltos de línea. --data-binarypor otro lado no lo hará (lo cual es importante si necesita mantener sus saltos de línea CRLF para multipart / form-data, consulte: stackoverflow.com/questions/10765243/… )
William Denniss
8
Porque me tomó un segundo: si está cargando un archivo, probablemente querrá usar una subcapa para estocurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
No pude hacer que --data-binary funcionara, pero pude usar el carácter% 0A (ver @malcolmocean) como respuesta. Cuando uso --data-binary "ip = 33.44.55. * \ N5.6.7.8" no lo trata como una nueva línea, sino --data "" ip = 33.44.55. *% 0A5.6.7.8 "envía la nueva línea a través de
Paul
51
Su caparazón pasa \seguido de en nlugar de una nueva línea para curl en lugar de "my message\n". Bash tiene soporte para otra sintaxis de cadena que admite secuencias de escape como \ny \t. Para usarlo, comience la cadena con $'y termine la cadena con ':
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Esto también funcionó para mí. Tendré que jugar con él, porque no funcionó con comillas dobles, lo que significa que no puedo usar comillas simples dentro de la cadena.
Tyler Collier
1
No sé de dónde sacaste esta idea de que esta es la "sintaxis de shell de JavaScript". La cáscara pasa my message\nliteralmente, no con dos escapes como dices.
Chris Down
@ChrisDown, me citaste mal. Dije "sintaxis de cadena de JavaScript", no "sintaxis de shell de JavaScript". Estoy usando la sintaxis de cadenas de JavaScript para tener claro lo que quiero decir con mis ejemplos de cadenas. Creo que a lo que te refieres my message\nes lo mismo a lo que me refiero "my message\n".
Benjamin Atkin
2
@BenAtkin Lo siento, desliz freudiano. Sin embargo, mi lectura seguía siendo correcta. \nno tiene nada que ver con JavaScript. De hecho, nada aquí tiene nada que ver con JavaScript.
Chris Down
Lo estoy usando para explicárselo a la gente. Y parece haber funcionado. La sintaxis de la cadena de shell no se comprende ampliamente. Si lo fuera, ¿por qué se habría hecho esta pregunta? ¿Qué debería haber usado para explicarlo?
Benjamin Atkin
16
¡Hay una forma mucho más sencilla!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Me cuesta entender esto. Entiendo que @es para indicar un nombre de archivo, pero ¿hay algún significado especial al usarlo @-? Que esta <<EOFhaciendo
Dennis T --Reintegro a Monica--
1
@-le dice a curl que consuma la entrada de entrada estándar y <<EOFes el indicador de fin de flujo para bash. Luego usamos la palabra mágica EOFen la carga útil de datos para decirle a bash que hemos terminado de escribir en el flujo.
Jammer
Además, -es una especie de forma estándar en GNU / Linux de especificar STDIN cuando se espera un nombre de archivo. No es universal, pero es bastante común.
Rich Remer
Al consultar el manual vemos que debería ser justo - y no @ -
user3504575
8
Tuvo un problema similar. Al cargar el archivo csv desde Mac al almacenamiento en la nube, se eliminaron nuevas líneas. Después de descargarlo, todo el archivo parecía una sola línea. Intenté agregar diferentes caracteres EOL '\ n' '\ r' '\ r \ n' sin éxito. El uso de '--data-binary' en lugar de '-d' resolvió el problema. Por cierto, este problema se produjo solo en Mac. '-d' funcionó bien mientras realizaba la llamada desde la máquina CentOS. Esto se parece mucho al carácter de nueva línea de Mac. Pero no tenga ganas de depurar más.
Muchas gracias por tu ayuda.
curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"
VS
curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"
Muchas gracias ! Esto no está relacionado con su Mac: estaba teniendo exactamente el mismo problema en Linux, y el uso --data-binary @resolvió mi problema (enviar un archivo .ics de varias líneas a un servidor CalDAV).
M-Jack
7
(Terminé aquí con una pregunta ligeramente diferente, así que solo voy a publicar mi respuesta porque podría ayudar a futuros exploradores)
Mi solución se aplica a las personas que envían datos de estilo de formulario, es decir, pares clave / valor en una cadena de consulta. Utilice el salto de línea codificado, que es %0Aigual que un espacio codificado %20. Puede utilizar http://meyerweb.com/eric/tools/dencoder/ para convertir otros símbolos.
Entonces, si desea establecer la clave messageen el valor:
comentario menor (tal vez error tipográfico) para un carácter de retorno de salto de línea / carraige debería ser% 0A en lugar de% A0
Paul
3
No es una respuesta a su pregunta, pero lo solucionaría creando un archivo temporal que contenga el mensaje y el salto de línea, y le daría a curl ese archivo para trabajar:
curl -X PUT -d @message.txt http://localhost:8000/hello
Si comienza los datos con la letra @, el resto debe ser un nombre de archivo para leer los datos, o - si desea que curl lea los datos de stdin. El contenido del archivo ya debe estar codificado en URL. También se pueden especificar varios archivos. Publicar datos de un archivo llamado 'foobar' se haría con --data @foobar.
El uso de archivos temporales es un método útil. Según la respuesta de Szocske, --data-binaryes una alternativa más fiel a -d, ya que enviará los datos textualmente.
William Denniss
7
-1; Usar un archivo temporal con -d @/path/to/temp/file.txtNO resuelve el problema de salto de línea. --data-binaryhace, ver arriba.
Frank Olschewski
Si ve esto porque se pregunta por qué sus comandos de curl no funcionan después de actualizar curl o actualizar a Windows 10, asegúrese de agregar comillas alrededor de la referencia de su archivo. Por ejemplo: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Mis scripts de reconstrucción de elasticsearch habían dejado de funcionar.
joezen777
3
Una manera muy fácil, solo Shift-Enter en la consola para el descanso. Muy legible al escribirlo también.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
\n\nfuncionó en Gmail, pero \nfue ignorado. Traté de duplicar el escape y otras sugerencias. También lo intenté \r\ny eso tampoco funcionó en Gmail. Nota: No me molesté en probar otros clientes de correo electrónico, tal vez fue un problema específico de Gmail.
Finalmente, dejé de buscar una solución y cambié text/plaina text/htmly solo usé <br />etiquetas.
Alguien sugirió que Sendgrid convierta el texto sin formato a HTML si tiene habilitado un píxel de seguimiento, lo cual tiene sentido. Quizás las nuevas líneas se destruyeron en el proceso de conversión de texto sin formato a html. Supongo que el cliente quiere un píxel de seguimiento, así que decidió cambiar a HTML.
Respuestas:
A veces desea proporcionar los datos que se enviarán literalmente.
La
--data-binary
opción hace eso.fuente
-d @message.txt
como se sugiere en la otra respuesta en particular puede alterar sus saltos de línea.--data-binary
por otro lado no lo hará (lo cual es importante si necesita mantener sus saltos de línea CRLF para multipart / form-data, consulte: 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
Su caparazón pasa
\
seguido de enn
lugar de una nueva línea para curl en lugar de"my message\n"
. Bash tiene soporte para otra sintaxis de cadena que admite secuencias de escape como\n
y\t
. Para usarlo, comience la cadena con$'
y termine la cadena con'
:Consulte las citas de ANSI-C en el Manual de referencia de Bash
fuente
my message\n
literalmente, no con dos escapes como dices.my message\n
es lo mismo a lo que me refiero"my message\n"
.\n
no tiene nada que ver con JavaScript. De hecho, nada aquí tiene nada que ver con JavaScript.¡Hay una forma mucho más sencilla!
Esto usará entre comillas ANSI-C para insertar el carácter de nueva línea.
Sin tuberías, sin archivos de datos. Consulte también Enviar nuevas líneas con cURL .
fuente
La solución para alguien que no quiere usar archivos y no quiere recurrir a la magia de escape de shell es:
Pero esto es literalmente nuevas líneas en la carga útil de datos de publicación, y no en los campos de formulario.
fuente
@
es para indicar un nombre de archivo, pero ¿hay algún significado especial al usarlo@-
? Que esta<<EOF
haciendo@-
le dice a curl que consuma la entrada de entrada estándar y<<EOF
es el indicador de fin de flujo para bash. Luego usamos la palabra mágicaEOF
en la carga útil de datos para decirle a bash que hemos terminado de escribir en el flujo.-
es una especie de forma estándar en GNU / Linux de especificar STDIN cuando se espera un nombre de archivo. No es universal, pero es bastante común.Tuvo un problema similar. Al cargar el archivo csv desde Mac al almacenamiento en la nube, se eliminaron nuevas líneas. Después de descargarlo, todo el archivo parecía una sola línea. Intenté agregar diferentes caracteres EOL '\ n' '\ r' '\ r \ n' sin éxito. El uso de '--data-binary' en lugar de '-d' resolvió el problema. Por cierto, este problema se produjo solo en Mac. '-d' funcionó bien mientras realizaba la llamada desde la máquina CentOS. Esto se parece mucho al carácter de nueva línea de Mac. Pero no tenga ganas de depurar más.
Muchas gracias por tu ayuda.
VS
fuente
--data-binary @
resolvió mi problema (enviar un archivo .ics de varias líneas a un servidor CalDAV).(Terminé aquí con una pregunta ligeramente diferente, así que solo voy a publicar mi respuesta porque podría ayudar a futuros exploradores)
Mi solución se aplica a las personas que envían datos de estilo de formulario, es decir, pares clave / valor en una cadena de consulta. Utilice el salto de línea codificado, que es
%0A
igual que un espacio codificado%20
. Puede utilizar http://meyerweb.com/eric/tools/dencoder/ para convertir otros símbolos.Entonces, si desea establecer la clave
message
en el valor:enviarías
fuente
No es una respuesta a su pregunta, pero lo solucionaría creando un archivo temporal que contenga el mensaje y el salto de línea, y le daría a curl ese archivo para trabajar:
Del manual :
fuente
--data-binary
es una alternativa más fiel a-d
, ya que enviará los datos textualmente.-d @/path/to/temp/file.txt
NO resuelve el problema de salto de línea.--data-binary
hace, ver arriba.Una manera muy fácil, solo Shift-Enter en la consola para el descanso. Muy legible al escribirlo también.
Haga esto para eliminar el salto de línea:
fuente
Estaba usando Sendgrid con este código (copiado a continuación) que se encuentra originalmente aquí https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
funcionó en Gmail, pero\n
fue ignorado. Traté de duplicar el escape y otras sugerencias. También lo intenté\r\n
y eso tampoco funcionó en Gmail. Nota: No me molesté en probar otros clientes de correo electrónico, tal vez fue un problema específico de Gmail.Finalmente, dejé de buscar una solución y cambié
text/plain
atext/html
y solo usé<br />
etiquetas.Alguien sugirió que Sendgrid convierta el texto sin formato a HTML si tiene habilitado un píxel de seguimiento, lo cual tiene sentido. Quizás las nuevas líneas se destruyeron en el proceso de conversión de texto sin formato a html. Supongo que el cliente quiere un píxel de seguimiento, así que decidió cambiar a HTML.
fuente