Tôi đã thử cách sau để gửi ngắt dòng bằng curl, nhưng \n
không được giải thích bằng curl.
curl -X PUT -d "my message\n" http://localhost:8000/hello
Làm cách nào để gửi ngắt dòng với curl?
Câu trả lời:
Đôi khi bạn muốn cung cấp dữ liệu được gửi nguyên văn.
Các --data-binary
tùy chọn nào đó.
-d @message.txt
như được đề xuất trong câu trả lời khác nói riêng có thể thay đổi ngắt dòng của bạn. --data-binary
mặt khác sẽ không (đó là quan trọng nếu bạn cần phải giữ linebreaks CRLF của bạn cho multipart / form-data, xem: 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
Vỏ của bạn đi qua \
theo sau n
chứ không phải là một đường mới để cuộn tròn hơn là "my message\n"
. Bash có hỗ trợ cho một cú pháp chuỗi khác hỗ trợ các chuỗi thoát như \n
và \t
. Để sử dụng nó, hãy bắt đầu chuỗi bằng $'
và kết thúc chuỗi bằng '
:
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Xem Trích dẫn ANSI-C trong Sổ tay Tham khảo Bash
my message\n
nguyên văn, không phải với hai lần thoát như bạn nói.
my message\n
giống như những gì tôi đang đề cập đến "my message\n"
.
\n
không liên quan gì đến JavaScript. Trên thực tế, không có gì ở đây liên quan đến JavaScript.
Có một cách dễ dàng hơn nhiều!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Điều này sẽ sử dụng ANSI-C Quoting để chèn ký tự dòng mới.
Không có đường ống, không có tệp dữ liệu. Xem thêm Gửi dòng mới với cURL .
Giải pháp cho những người không muốn sử dụng tệp và không muốn sử dụng phép thuật thoát shell là:
curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF
Nhưng đây là dòng mới theo nghĩa đen trong tải dữ liệu bài đăng, và không phải trong các trường biểu mẫu.
@
là để chỉ ra một tên tệp nhưng có một số ý nghĩa đặc biệt khi sử dụng @-
không? Đang <<EOF
làm gì vậy?
@-
yêu cầu curl tiêu thụ đầu vào từ tiêu chuẩn trong và <<EOF
là chỉ báo kết thúc luồng cho bash. Sau đó, chúng tôi sử dụng từ ma thuật EOF
trong phần tải dữ liệu để nói với bash rằng chúng tôi đã ghi xong vào luồng.
-
là cách tiêu chuẩn trong GNU / Linux để chỉ định STDIN khi tên tệp được mong đợi. Nó không phổ biến, nhưng nó khá phổ biến.
Có vấn đề tương tự. Trong khi tải tệp csv từ Mac lên bộ nhớ đám mây, các dòng mới đã bị xóa. Sau khi tải xuống, toàn bộ tệp trông giống như một dòng duy nhất. Tôi đã thử thêm các ký tự EOL khác nhau '\ n' '\ r' '\ r \ n' nhưng không thành công. Sử dụng '--data-binary' thay vì '-d' đã giải quyết được vấn đề. Btw vấn đề này chỉ xảy ra từ Mac. '-d' hoạt động tốt khi thực hiện cuộc gọi từ máy CentOS. Điều này rất giống do ký tự dòng mới của Mac. Nhưng không cảm thấy muốn gỡ lỗi nữa.
Cảm ơn sự giúp đỡ của bạn.
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 @
đã giải quyết được sự cố của tôi (gửi tệp .ics nhiều dòng tới máy chủ CalDAV).
(Tôi đã kết thúc ở đây với một câu hỏi hơi khác, vì vậy tôi sẽ đăng câu trả lời của mình vì nó có thể giúp ích cho những người khám phá trong tương lai)
Giải pháp của tôi áp dụng cho những người đang gửi dữ liệu kiểu biểu mẫu, tức là các cặp khóa / giá trị trong một chuỗi truy vấn. Sử dụng ngắt dòng được mã hóa %0A
, giống như cách một không gian được mã hóa %20
. Bạn có thể sử dụng http://meyerweb.com/eric/tools/dencoder/ để chuyển đổi các ký hiệu khác.
Vì vậy, nếu bạn muốn đặt khóa message
thành giá trị:
line one
another
bạn sẽ gửi
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
Không phải là câu trả lời cho câu hỏi của bạn, nhưng tôi sẽ giải quyết vấn đề đó bằng cách tạo một tệp tạm thời chứa thông báo và ngắt dòng, đồng thời cung cấp cho tệp curl đó hoạt động trên:
curl -X PUT -d @message.txt http://localhost:8000/hello
Từ sách hướng dẫn :
Nếu bạn bắt đầu dữ liệu bằng ký tự @, phần còn lại phải là tên tệp để đọc dữ liệu từ đó, hoặc - nếu bạn muốn curl đọc dữ liệu từ stdin. Nội dung của tệp phải được mã hóa URL. Nhiều tệp cũng có thể được chỉ định. Do đó, việc đăng dữ liệu từ tệp có tên 'foobar' sẽ được thực hiện với --data @foobar.
--data-binary
là một sự thay thế trung thực hơn -d
, vì nó sẽ gửi dữ liệu nguyên văn.
-d @/path/to/temp/file.txt
KHÔNG giải quyết được vấn đề ngắt dòng. --data-binary
hiện, xem ở trên.
Một cách rất dễ dàng, chỉ cần Shift-Enter trong bảng điều khiển để giải lao. Nhập nó vào cũng rất dễ đọc.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
Làm điều này để loại bỏ ngắt dòng:
curl -d "line1 \
line2" http-echo.com
Server gets this: line1 line2
Tôi đang sử dụng Sendgrid với mã này (được sao chép bên dưới) ban đầu được tìm thấy tại đây https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
hoạt động trong Gmail, nhưng \n
bị bỏ qua. Tôi đã cố gắng tăng gấp đôi lần trốn thoát và những gợi ý khác. Tôi cũng đã thử \r\n
và điều đó cũng không hoạt động trong Gmail. Lưu ý: Tôi không bận tâm đến việc kiểm tra các ứng dụng email khác, có thể đó là một vấn đề cụ thể của 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!"}]}'
Cuối cùng tôi đã từ bỏ tìm kiếm một giải pháp và chuyển sang text/plain
để text/html
và chỉ được sử dụng <br />
thẻ.
Ai đó đã đề xuất rằng Sendgrid chuyển đổi văn bản rõ ràng sang HTML nếu bạn đã bật pixel theo dõi, điều này có ý nghĩa. Có thể các dòng mới đã bị phá hủy trong quá trình chuyển đổi từ bản rõ sang html. Tôi cho rằng khách hàng muốn có pixel theo dõi, vì vậy đã quyết định chuyển sang HTML.