Esta é a melhor forma de o fazer. A alternativa de usar -d @message.txtcomo sugerido na outra resposta em particular pode alterar suas quebras de linha. --data-binarypor outro lado, não (o que é importante se você precisar manter as quebras de linha CRLF para multipart / form-data, consulte: stackoverflow.com/questions/10765243/… )
William Denniss
8
Porque demorei um segundo: se você está enviando um arquivo, provavelmente vai querer usar um subshell para issocurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
Não consegui fazer o --data-binary funcionar, mas consegui usar a resposta do caractere% 0A (consulte @malcolmocean). Quando eu uso --data-binary "ip = 33.44.55. * \ N5.6.7.8" ele não o trata como nova linha, mas --data "" ip = 33.44.55. *% 0A5.6.7.8 "envia a nova linha
Paul
50
Seu shell está passando \seguido em nvez de uma nova linha para curl em vez de "my message\n". Bash tem suporte para uma outra sintaxe string que suporta seqüências de escape, como \ne \t. Para usá-lo, comece a string com $'e termine-a com ':
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Isso funcionou para mim também. Vou ter que brincar com isso, porque não funcionou com aspas duplas, o que significa que não posso usar aspas simples dentro da string.
Tyler Collier
1
Não sei de onde você tirou essa ideia de que essa é a "sintaxe do shell do JavaScript". O shell passa my message\nliteralmente, não com dois escapes, como você diz.
Chris Down
@ChrisDown, você me citou mal. Eu disse "sintaxe de string JavaScript", não "sintaxe shell JavaScript". Estou usando a sintaxe de string de JavaScript para deixar claro o que quero dizer com meus exemplos de string. Acho que você está se referindo como my message\né o mesmo que estou me referindo "my message\n".
Benjamin Atkin
2
@BenAtkin Desculpe, deslize freudiano. No entanto, minha leitura ainda estava correta. \nnão tem nada a ver com JavaScript. Na verdade, nada aqui tem nada a ver com JavaScript.
Chris Down
Estou usando para explicar às pessoas. E parece que funcionou. A sintaxe da string shell não é amplamente compreendida. Se fosse, por que essa pergunta teria sido feita? O que eu deveria ter usado para explicar isso?
Benjamin Atkin
16
Existe uma maneira muito mais fácil!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Isso usará ANSI-C Quoting para inserir o caractere de nova linha.
Estou tendo problemas para entender isso. Eu entendo que @é para indicar um nome de arquivo, mas há algum significado especial ao usar @-? O que está <<EOFfazendo?
Dennis T - Restabelecer Monica -
1
@-diz ao curl para consumir a entrada da entrada padrão e <<EOFé o indicador de fim do fluxo para o bash. Em seguida, usamos a palavra mágica EOFna carga útil de dados para informar ao bash que terminamos de gravar no fluxo.
Jammer de
Além disso, -é meio que a maneira padrão no GNU / Linux de especificar STDIN quando um nome de arquivo é esperado. Não é universal, mas é bastante comum.
Rich Remer
Consultando o manual, vemos que deve ser apenas - e não @ -
user3504575
8
Teve um problema semelhante. Durante o upload do arquivo csv do Mac para o armazenamento em nuvem, novas linhas foram sendo removidas. Depois de baixá-lo, todo o arquivo parecia uma única linha. Tentei adicionar diferentes caracteres EOL '\ n' '\ r' '\ r \ n' sem sucesso. Usar '--data-binary' em vez de '-d' resolveu o problema. Btw este problema ocorreu apenas no Mac. '-d' funcionou bem ao fazer a chamada da máquina CentOS. Isso se parece muito com o caractere de nova linha do Mac. Mas não quero mais depurar.
Muito obrigado por sua ajuda.
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"
Muito obrigado ! Isso não está relacionado ao seu Mac: eu estava tendo exatamente o mesmo problema no Linux e usar o --data-binary @resolveu (enviar um arquivo .ics multilinha para um servidor CalDAV).
M-Jack
7
(Acabei aqui com uma pergunta um pouco diferente, então só vou postar minha resposta porque pode ajudar futuros exploradores)
Minha solução se aplica a pessoas que estão enviando dados em estilo de formulário, ou seja, pares de chave / valor em uma string de consulta. Use a quebra de linha codificada, que é %0Acomo um espaço codificado %20. Você pode usar http://meyerweb.com/eric/tools/dencoder/ para converter outros símbolos.
Portanto, se você deseja definir a chave messagepara o valor:
comentário secundário (talvez erro de digitação) para uma quebra de linha / caractere de retorno de caractere deve ser% 0A em vez de% A0
Paulo
3
Não é uma resposta à sua pergunta, mas eu iria contorná-la criando um arquivo temporário contendo a mensagem e a quebra de linha e dando ao curl esse arquivo para trabalhar:
curl -X PUT -d @message.txt http://localhost:8000/hello
Se você iniciar os dados com a letra @, o resto deve ser um nome de arquivo de onde ler os dados, ou - se você quiser que o curl leia os dados de stdin. O conteúdo do arquivo já deve ser codificado por URL. Vários arquivos também podem ser especificados. A postagem de dados de um arquivo chamado 'foobar' seria, portanto, feita com --data @foobar.
Usar arquivos temporários é uma abordagem útil. De acordo com a resposta de Szocske, --data-binaryé uma alternativa mais fiel ao -d, pois enviará os dados na íntegra.
William Denniss
7
-1; Usar um arquivo temporário com -d @/path/to/temp/file.txtNÃO resolve o problema de quebra de linha. --data-binaryfaz, veja acima.
Frank Olschewski,
Se você está vendo isso porque está se perguntando por que seus comandos curl não funcionam depois de atualizar o curl ou atualizar para o Windows 10, certifique-se de adicionar aspas em torno da referência do arquivo. Por exemplo: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Meus scripts de reconstrução de elasticsearch pararam de funcionar.
joezen777
3
Uma maneira muito fácil, apenas Shift-Enter no console para o intervalo. Muito legível digitando-o também.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
\n\ntrabalhou no Gmail, mas \nfoi ignorado. Tentei dobrar a fuga e outras sugestões. Eu também tentei \r\ne não funcionou no Gmail também. Nota: Não me preocupei em testar outros clientes de e-mail, talvez fosse um problema específico do Gmail.
Eventualmente, desisti de procurar uma solução e mudei as tags text/plainpara text/htmle acabei de usar <br />.
Alguém sugeriu que Sendgrid converta texto simples em HTML se você tiver um pixel de rastreamento habilitado, o que faz sentido. Talvez as novas linhas tenham sido destruídas no processo de conversão de texto simples em html. Presumo que o cliente deseja um pixel de rastreamento, então decidi mudar para HTML.
Respostas:
Às vezes, você deseja fornecer os dados a serem enviados literalmente.
A
--data-binary
opção faz isso.fonte
-d @message.txt
como sugerido na outra resposta em particular pode alterar suas quebras de linha.--data-binary
por outro lado, não (o que é importante se você precisar manter as quebras de linha 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
Seu shell está passando
\
seguido emn
vez de uma nova linha para curl em vez de"my message\n"
. Bash tem suporte para uma outra sintaxe string que suporta seqüências de escape, como\n
e\t
. Para usá-lo, comece a string com$'
e termine-a com'
:Consulte ANSI-C Quoting no Bash Reference Manual
fonte
my message\n
literalmente, não com dois escapes, como você diz.my message\n
é o mesmo que estou me referindo"my message\n"
.\n
não tem nada a ver com JavaScript. Na verdade, nada aqui tem nada a ver com JavaScript.Existe uma maneira muito mais fácil!
Isso usará ANSI-C Quoting para inserir o caractere de nova linha.
Sem tubulação, sem arquivos de dados. Consulte também Enviando novas linhas com cURL .
fonte
A solução para quem não quer usar arquivos e não quer recorrer à magia de escape de shell é:
Mas isso é literalmente novas linhas na carga útil de dados de postagem, e não em campos de formulário.
fonte
@
é para indicar um nome de arquivo, mas há algum significado especial ao usar@-
? O que está<<EOF
fazendo?@-
diz ao curl para consumir a entrada da entrada padrão e<<EOF
é o indicador de fim do fluxo para o bash. Em seguida, usamos a palavra mágicaEOF
na carga útil de dados para informar ao bash que terminamos de gravar no fluxo.-
é meio que a maneira padrão no GNU / Linux de especificar STDIN quando um nome de arquivo é esperado. Não é universal, mas é bastante comum.Teve um problema semelhante. Durante o upload do arquivo csv do Mac para o armazenamento em nuvem, novas linhas foram sendo removidas. Depois de baixá-lo, todo o arquivo parecia uma única linha. Tentei adicionar diferentes caracteres EOL '\ n' '\ r' '\ r \ n' sem sucesso. Usar '--data-binary' em vez de '-d' resolveu o problema. Btw este problema ocorreu apenas no Mac. '-d' funcionou bem ao fazer a chamada da máquina CentOS. Isso se parece muito com o caractere de nova linha do Mac. Mas não quero mais depurar.
Muito obrigado por sua ajuda.
VS
fonte
--data-binary @
resolveu (enviar um arquivo .ics multilinha para um servidor CalDAV).(Acabei aqui com uma pergunta um pouco diferente, então só vou postar minha resposta porque pode ajudar futuros exploradores)
Minha solução se aplica a pessoas que estão enviando dados em estilo de formulário, ou seja, pares de chave / valor em uma string de consulta. Use a quebra de linha codificada, que é
%0A
como um espaço codificado%20
. Você pode usar http://meyerweb.com/eric/tools/dencoder/ para converter outros símbolos.Portanto, se você deseja definir a chave
message
para o valor:você enviaria
fonte
Não é uma resposta à sua pergunta, mas eu iria contorná-la criando um arquivo temporário contendo a mensagem e a quebra de linha e dando ao curl esse arquivo para trabalhar:
Do manual :
fonte
--data-binary
é uma alternativa mais fiel ao-d
, pois enviará os dados na íntegra.-d @/path/to/temp/file.txt
NÃO resolve o problema de quebra de linha.--data-binary
faz, veja acima.Uma maneira muito fácil, apenas Shift-Enter no console para o intervalo. Muito legível digitando-o também.
Faça isso para remover a quebra de linha:
fonte
Eu estava usando Sendgrid com este código (copiado abaixo) originalmente encontrado aqui https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
trabalhou no Gmail, mas\n
foi ignorado. Tentei dobrar a fuga e outras sugestões. Eu também tentei\r\n
e não funcionou no Gmail também. Nota: Não me preocupei em testar outros clientes de e-mail, talvez fosse um problema específico do Gmail.Eventualmente, desisti de procurar uma solução e mudei as tags
text/plain
paratext/html
e acabei de usar<br />
.Alguém sugeriu que Sendgrid converta texto simples em HTML se você tiver um pixel de rastreamento habilitado, o que faz sentido. Talvez as novas linhas tenham sido destruídas no processo de conversão de texto simples em html. Presumo que o cliente deseja um pixel de rastreamento, então decidi mudar para HTML.
fonte