Saya telah mencoba yang berikut untuk mengirim jeda baris dengan curl, tetapi \n
tidak diartikan oleh curl.
curl -X PUT -d "my message\n" http://localhost:8000/hello
Bagaimana cara mengirim jeda baris dengan curl?
Jawaban:
Terkadang Anda ingin memberikan data untuk dikirim kata demi kata.
The --data-binary
pilihan melakukan itu.
-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 menyimpan
curl -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 oleh n
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 '
:
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Lihat ANSI-C Quoting di Bash Reference Manual
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!
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 .
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.
@
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 ajaib EOF
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:
line one
another
Anda akan mengirim
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
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"
--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:
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.
--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.
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
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.
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": "your.email@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'
Akhirnya saya menyerah mencari solusi dan beralih text/plain
ke text/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.