Ini cara terbaik untuk melakukannya. Alternatif penggunaan -d @message.txtseperti yang disarankan dalam jawaban lain secara khusus dapat mengubah jeda baris Anda. --data-binarydi sisi lain tidak akan (yang penting jika Anda perlu menyimpan
pemutusan baris
9
Karena saya butuh waktu sebentar: jika Anda mengunggah file, Anda mungkin ingin menggunakan subkulit untuk inicurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana
Menarik, tapi apa keuntungannya?
Szocske
8
+1, jawaban yang benar. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski
4
Saya tidak dapat mengaktifkan --data-binary tetapi dapat menggunakan jawaban karakter% 0A (lihat @malcolmocean). Saat saya menggunakan --data-binary "ip = 33.44.55. * \ N5.6.7.8" tidak memperlakukannya sebagai baris baru, tetapi --data "" ip = 33.44.55. *% 0A5.6.7.8 "mengirim jalur baru melalui
Paul
51
Shell Anda lewat \diikuti oleh nbukan baris baru untuk digulung bukan "my message\n". Bash memiliki dukungan untuk sintaks string lain yang mendukung urutan escape seperti \ndan \t. Untuk menggunakannya, mulai string dengan $'dan akhiri string dengan ':
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Ini berhasil juga untuk saya. Saya harus bermain-main dengannya, karena itu tidak berfungsi dengan tanda kutip ganda, yang berarti saya tidak dapat menggunakan tanda kutip tunggal dalam string.
Tyler Collier
1
Saya tidak tahu dari mana Anda mendapatkan ide bahwa ini adalah "sintaks shell JavaScript". Shell melewati my message\nkata demi kata, bukan dengan dua pelolosan seperti yang Anda katakan.
Chris Down
@ChrisDown, Anda salah mengutip saya. Saya mengatakan "sintaks string JavaScript", bukan "sintaks shell JavaScript". Saya menggunakan sintaks string JavaScript untuk memperjelas apa yang saya maksud dengan contoh string saya. Saya pikir apa yang Anda maksud my message\nsama dengan apa yang saya maksud "my message\n".
Benjamin Atkin
2
@BenAtkin Maaf, freudian terpeleset. Namun, pembacaan saya masih benar. \ntidak ada hubungannya dengan JavaScript. Nyatanya di sini tidak ada hubungannya sama sekali dengan JavaScript.
Chris Down
Saya menggunakannya untuk menjelaskannya kepada orang-orang. Dan tampaknya berhasil. Sintaks string shell tidak dipahami secara luas. Jika ya, mengapa pertanyaan ini ditanyakan? Apa yang harus saya gunakan untuk menjelaskannya?
Benjamin Atkin
16
Ada cara yang lebih mudah!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Ini akan menggunakan ANSI-C Quoting untuk memasukkan karakter baris baru.
Saya kesulitan memahami ini. Saya mengerti itu @untuk menunjukkan nama file tetapi apakah ada arti khusus saat menggunakan @-? Apa yang <<EOFdilakukan?
Dennis T --Reinstate Monica -
1
@-memberitahu curl untuk mengkonsumsi input dari standar dalam, dan <<EOFmerupakan indikator akhir aliran untuk bash. Kami kemudian menggunakan kata ajaib EOFdalam payload data untuk memberi tahu bash bahwa kami selesai menulis ke aliran.
Jammer
Juga, -ini semacam cara standar di GNU / Linux untuk menentukan STDIN ketika nama file diharapkan. Ini tidak universal, tapi cukup umum.
Rich Remer
Dengan berkonsultasi dengan manual kita melihat bahwa itu harus adil - dan tidak @ -
user3504575
8
(Saya berakhir di sini dengan pertanyaan yang sedikit berbeda, jadi saya hanya akan memposting jawaban saya karena mungkin membantu penjelajah masa depan)
Solusi saya berlaku untuk orang-orang yang mengirim data gaya formulir, yaitu pasangan kunci / nilai dalam string kueri. Gunakan jeda baris yang dikodekan %0A, seperti bagaimana ruang yang dikodekan %20. Anda dapat menggunakan http://meyerweb.com/eric/tools/dencoder/ untuk mengonversi simbol lain.
Jadi jika Anda ingin mengatur kunci messageke nilai:
komentar kecil (mungkin salah ketik) untuk jeda baris / karakter kembali karraige itu harus% 0A daripada% A0
Paul
8
Punya masalah serupa. Saat mengunggah file csv dari Mac ke penyimpanan cloud, baris baru telah dihapus. Setelah mengunduhnya, seluruh file tampak seperti satu baris. Saya mencoba menambahkan karakter EOL yang berbeda '\ n' '\ r' '\ r \ n' tetapi tidak berhasil. Menggunakan '--data-binary' alih-alih '-d' menyelesaikan masalah. Btw masalah ini hanya terjadi dari Mac. '-d' berfungsi dengan baik saat melakukan panggilan dari mesin CentOS. Ini sangat mirip karena karakter baris baru Mac. Tapi jangan merasa ingin men-debug lagi.
Terima kasih banyak atas bantuannya.
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"
Terima kasih banyak ! Ini tidak terkait dengan Mac Anda: Saya mengalami masalah yang sama persis di Linux, dan penggunaan --data-binary @telah menyelesaikan masalah saya (mengirim file multiline .ics ke server CalDAV).
M-Jack
3
Bukan jawaban untuk pertanyaan Anda, tetapi saya akan mengatasinya dengan membuat file sementara yang berisi pesan dan jeda baris, dan memberikan curl file itu untuk dikerjakan:
curl -X PUT -d @message.txt http://localhost:8000/hello
Jika Anda memulai data dengan huruf @, sisanya harus berupa nama file untuk membaca data, atau - jika Anda ingin curl membaca data dari stdin. Konten file harus sudah dienkode URL. Beberapa file juga dapat ditentukan. Memposting data dari file bernama 'foobar' akan dilakukan dengan --data @foobar.
Menggunakan file sementara adalah pendekatan yang praktis. Sesuai jawaban Szocske, --data-binaryadalah alternatif yang lebih tepat -d, karena akan mengirimkan data secara verbatim.
William Denniss
7
-1; Menggunakan file sementara dengan -d @/path/to/temp/file.txtTIDAK menyelesaikan masalah pemutusan baris. --data-binarytidak, lihat di atas.
Frank Olschewski
Jika Anda melihat ini karena Anda bertanya-tanya mengapa perintah curl Anda tidak berfungsi setelah memutakhirkan curl atau memutakhirkan ke windows 10, pastikan Anda menambahkan tanda kutip di sekitar referensi file Anda. Misalnya: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Skrip pembangunan kembali elasticsearch saya telah berhenti bekerja.
joezen777
3
Cara yang sangat mudah, cukup Shift-Enter di konsol untuk istirahat. Mengetiknya juga sangat mudah dibaca.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
\n\nbekerja di Gmail, tetapi \ndiabaikan. Saya mencoba menggandakan pelarian dan saran lainnya. Saya juga mencoba \r\ndan itu juga tidak berhasil di Gmail. Catatan: Saya tidak repot-repot menguji klien email lain, mungkin itu masalah khusus Gmail.
Akhirnya saya menyerah mencari solusi dan beralih text/plainke text/htmldan hanya menggunakan <br />tag.
Seseorang menyarankan agar Sendgrid mengonversi teks biasa menjadi HTML jika Anda mengaktifkan piksel pelacakan, yang masuk akal. Mungkin baris baru dihancurkan dalam proses konversi teks biasa ke html. Saya berasumsi klien menginginkan piksel pelacakan, jadi memutuskan untuk beralih ke HTML.
Jawaban:
Terkadang Anda ingin memberikan data untuk dikirim kata demi kata.
The
--data-binary
pilihan melakukan itu.sumber
-d @message.txt
seperti yang disarankan dalam jawaban lain secara khusus dapat mengubah jeda baris Anda.--data-binary
di sisi lain tidak akan (yang penting jika Anda perlu menyimpancurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
curl --data-binary @/path/to/file.txt http://example.com/target
Shell Anda lewat
\
diikuti olehn
bukan baris baru untuk digulung bukan"my message\n"
. Bash memiliki dukungan untuk sintaks string lain yang mendukung urutan escape seperti\n
dan\t
. Untuk menggunakannya, mulai string dengan$'
dan akhiri string dengan'
:Lihat ANSI-C Quoting di Bash Reference Manual
sumber
my message\n
kata demi kata, bukan dengan dua pelolosan seperti yang Anda katakan.my message\n
sama dengan apa yang saya maksud"my message\n"
.\n
tidak ada hubungannya dengan JavaScript. Nyatanya di sini tidak ada hubungannya sama sekali dengan JavaScript.Ada cara yang lebih mudah!
Ini akan menggunakan ANSI-C Quoting untuk memasukkan karakter baris baru.
Tanpa perpipaan, tidak ada file data. Lihat juga Mengirim Baris Baru dengan cURL .
sumber
Solusi untuk seseorang yang tidak ingin menggunakan file, dan tidak ingin menggunakan sihir pelarian shell adalah:
Tapi ini adalah baris baru literal dalam muatan data pos, dan bukan dalam bidang formulir.
sumber
@
untuk menunjukkan nama file tetapi apakah ada arti khusus saat menggunakan@-
? Apa yang<<EOF
dilakukan?@-
memberitahu curl untuk mengkonsumsi input dari standar dalam, dan<<EOF
merupakan indikator akhir aliran untuk bash. Kami kemudian menggunakan kata ajaibEOF
dalam payload data untuk memberi tahu bash bahwa kami selesai menulis ke aliran.-
ini semacam cara standar di GNU / Linux untuk menentukan STDIN ketika nama file diharapkan. Ini tidak universal, tapi cukup umum.(Saya berakhir di sini dengan pertanyaan yang sedikit berbeda, jadi saya hanya akan memposting jawaban saya karena mungkin membantu penjelajah masa depan)
Solusi saya berlaku untuk orang-orang yang mengirim data gaya formulir, yaitu pasangan kunci / nilai dalam string kueri. Gunakan jeda baris yang dikodekan
%0A
, seperti bagaimana ruang yang dikodekan%20
. Anda dapat menggunakan http://meyerweb.com/eric/tools/dencoder/ untuk mengonversi simbol lain.Jadi jika Anda ingin mengatur kunci
message
ke nilai:Anda akan mengirim
sumber
Punya masalah serupa. Saat mengunggah file csv dari Mac ke penyimpanan cloud, baris baru telah dihapus. Setelah mengunduhnya, seluruh file tampak seperti satu baris. Saya mencoba menambahkan karakter EOL yang berbeda '\ n' '\ r' '\ r \ n' tetapi tidak berhasil. Menggunakan '--data-binary' alih-alih '-d' menyelesaikan masalah. Btw masalah ini hanya terjadi dari Mac. '-d' berfungsi dengan baik saat melakukan panggilan dari mesin CentOS. Ini sangat mirip karena karakter baris baru Mac. Tapi jangan merasa ingin men-debug lagi.
Terima kasih banyak atas bantuannya.
VS
sumber
--data-binary @
telah menyelesaikan masalah saya (mengirim file multiline .ics ke server CalDAV).Bukan jawaban untuk pertanyaan Anda, tetapi saya akan mengatasinya dengan membuat file sementara yang berisi pesan dan jeda baris, dan memberikan curl file itu untuk dikerjakan:
Dari manual :
sumber
--data-binary
adalah alternatif yang lebih tepat-d
, karena akan mengirimkan data secara verbatim.-d @/path/to/temp/file.txt
TIDAK menyelesaikan masalah pemutusan baris.--data-binary
tidak, lihat di atas.Cara yang sangat mudah, cukup Shift-Enter di konsol untuk istirahat. Mengetiknya juga sangat mudah dibaca.
Lakukan ini untuk menghapus jeda baris:
sumber
Saya menggunakan Sendgrid dengan kode ini (disalin di bawah) yang awalnya ditemukan di sini https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
bekerja di Gmail, tetapi\n
diabaikan. Saya mencoba menggandakan pelarian dan saran lainnya. Saya juga mencoba\r\n
dan itu juga tidak berhasil di Gmail. Catatan: Saya tidak repot-repot menguji klien email lain, mungkin itu masalah khusus Gmail.Akhirnya saya menyerah mencari solusi dan beralih
text/plain
ketext/html
dan hanya menggunakan<br />
tag.Seseorang menyarankan agar Sendgrid mengonversi teks biasa menjadi HTML jika Anda mengaktifkan piksel pelacakan, yang masuk akal. Mungkin baris baru dihancurkan dalam proses konversi teks biasa ke html. Saya berasumsi klien menginginkan piksel pelacakan, jadi memutuskan untuk beralih ke HTML.
sumber