Bagaimana cara mengirim jeda baris dengan curl?

91

Saya telah mencoba yang berikut untuk mengirim jeda baris dengan curl, tetapi \ntidak diartikan oleh curl.

curl -X PUT -d "my message\n" http://localhost:8000/hello

Bagaimana cara mengirim jeda baris dengan curl?

deamon
sumber
1
Di platform apa? Mungkin relevan
Pekka

Jawaban:

114

Terkadang Anda ingin memberikan data untuk dikirim kata demi kata.

The --data-binarypilihan melakukan itu.

Szocske
sumber
2
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

Lihat ANSI-C Quoting di Bash Reference Manual

Benjamin Atkin
sumber
1
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.

Tanpa perpipaan, tidak ada file data. Lihat juga Mengirim Baris Baru dengan cURL .

Dave Kerr
sumber
Yang itu harus menjadi jawaban yang diterima meskipun menggunakan sintaks Bash
odiszapc
Ini adalah satu-satunya hal yang berhasil bagi saya dari semua jawaban
Bob Kocisko
15

Solusi untuk seseorang yang tidak ingin menggunakan file, dan tidak ingin menggunakan sihir pelarian shell adalah:

curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF

Tapi ini adalah baris baru literal dalam muatan data pos, dan bukan dalam bidang formulir.

Jammer
sumber
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:

line one
another

Anda akan mengirim

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
MalcolmOcean
sumber
1
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"
SutuwaShell
sumber
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

Dari manual :

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.

Pekka
sumber
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

Lakukan ini untuk menghapus jeda baris:

curl -d "line1 \
line2" http-echo.com

Server gets this: line1 line2
John Williams
sumber
-2

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\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.

    curl --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"personalizations": [{"to": [{"email": "[email protected]"}]}],"from": {"email": "[email protected]"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'

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.

PJ Brunet
sumber