Próbowałem wykonać następujące czynności, aby wysłać przerwanie linii z zawinięciem, ale \n
nie jest interpretowane przez zawijanie.
curl -X PUT -d "my message\n" http://localhost:8000/hello
Jak mogę wysłać łamanie linii z zawijaniem?
Próbowałem wykonać następujące czynności, aby wysłać przerwanie linii z zawinięciem, ale \n
nie jest interpretowane przez zawijanie.
curl -X PUT -d "my message\n" http://localhost:8000/hello
Jak mogę wysłać łamanie linii z zawijaniem?
Odpowiedzi:
Czasami chcesz podać dane do wysłania dosłownie.
Ta --data-binary
opcja to robi.
-d @message.txt
sugerowana w szczególności w drugiej odpowiedzi może zmienić podziały wierszy. --data-binary
z drugiej strony nie (co jest ważne, jeśli chcesz zachować
curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
curl --data-binary @/path/to/file.txt http://example.com/target
Twoja skorupa przechodzi \
następnie n
zamiast nowej linii do zwijania zamiast "my message\n"
. Bash obsługuje inną składnię ciągu, która obsługuje sekwencje ucieczki, takie jak \n
i \t
. Aby go użyć, rozpocznij ciąg od $'
i zakończ ciąg '
:
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Zobacz cytowanie ANSI-C w podręczniku Bash Reference Manual
my message\n
dosłownie, a nie z dwoma ucieczkami, jak mówisz.
my message\n
jest tym samym, co ja nazywam "my message\n"
.
\n
nie ma nic wspólnego z JavaScriptem. W rzeczywistości nic tutaj nie ma nic wspólnego z JavaScriptem.
Jest o wiele łatwiejszy sposób!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Spowoduje to użycie cytowania ANSI-C do wstawienia znaku nowego wiersza.
Bez rurociągów, bez plików danych. Zobacz także Wysyłanie nowych linii z cURL .
Rozwiązaniem dla kogoś, kto nie chce używać plików i nie chce uciekać się do magii ucieczki powłoki, jest:
curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF
Ale to są dosłowne znaki nowej linii w ładunku danych post, a nie w polach formularza.
@
ma to wskazywać nazwę pliku, ale czy ma jakieś specjalne znaczenie podczas używania @-
? Co <<EOF
robisz?
@-
mówi curl, aby konsumował dane wejściowe ze standardu in i <<EOF
jest wskaźnikiem końca strumienia dla bash. Następnie używamy magicznego słowa EOF
w ładunku danych, aby powiedzieć bashowi, że skończyliśmy pisać do strumienia.
-
w systemie GNU / Linux jest to standardowy sposób określania STDIN, gdy oczekiwana jest nazwa pliku. Nie jest uniwersalny, ale jest dość powszechny.
Miałem podobny problem. Podczas przesyłania pliku csv z komputera Mac do chmury usuwano nowe wiersze. Po pobraniu cały plik wyglądał jak jedna linia. Próbowałem dodać różne znaki EOL '\ n' '\ r' '\ r \ n' bez powodzenia. Użycie „--data-binary” zamiast „-d” rozwiązało problem. Przy okazji ten problem wystąpił tylko z komputerów Mac. „-d” działało dobrze podczas wykonywania połączenia z komputera CentOS. To bardzo wygląda ze względu na znak nowej linii Maca. Ale nie chcę już debugować.
Bardzo dziękuję za Twoją pomoc.
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 @
rozwiązało mój problem (wysłanie pliku wielowierszowego .ics na serwer CalDAV).
(Skończyłem z nieco innym pytaniem, więc po prostu opublikuję swoją odpowiedź, ponieważ może to pomóc przyszłym odkrywcom)
Moje rozwiązanie dotyczy osób, które wysyłają dane w formie formularza, tj. Pary klucz / wartość w ciągu zapytania. Użyj zakodowanego podziału wiersza, czyli %0A
takiego samego, jak zakodowana spacja %20
. Możesz użyć http://meyerweb.com/eric/tools/dencoder/, aby przekonwertować inne symbole.
Więc jeśli chcesz ustawić klucz message
na wartość:
line one
another
wysłałbyś
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
Nie jest to odpowiedź na twoje pytanie, ale obejdę to, tworząc tymczasowy plik zawierający wiadomość i podział wiersza, i daję curlowi ten plik do pracy:
curl -X PUT -d @message.txt http://localhost:8000/hello
Z instrukcji :
Jeśli zaczynasz dane od litery @, reszta powinna być nazwą pliku, z którego dane będą odczytywane, lub - jeśli chcesz, aby curl odczytał dane ze stdin. Zawartość pliku musi być już zakodowana w formacie URL. Można również określić wiele plików. Wysyłanie danych z pliku o nazwie „foobar” odbywałoby się zatem za pomocą opcji --data @foobar.
--data-binary
jest bardziej wierną alternatywą -d
, ponieważ przesyła dane dosłownie.
-d @/path/to/temp/file.txt
NIE rozwiązuje problemu łamania linii. --data-binary
robi, patrz wyżej.
Bardzo łatwy sposób, po prostu Shift-Enter w konsoli na przerwę. Bardzo czytelne wpisywanie.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
Zrób to, aby usunąć podział wiersza:
curl -d "line1 \
line2" http-echo.com
Server gets this: line1 line2
Używałem Sendgrid z tym kodem (skopiowanym poniżej) pierwotnie znalezionym tutaj https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
działał w Gmailu, ale \n
został zignorowany. Próbowałem podwoić ucieczkę i inne sugestie. Próbowałem też \r\n
i to też nie działało w Gmailu. Uwaga: nie zawracałem sobie głowy testowaniem innych klientów poczty e-mail, być może był to problem związany z Gmailem.
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!"}]}'
W końcu dałem się szuka rozwiązania i włączeniu text/plain
do text/html
i po prostu używane <br />
tagi.
Ktoś zasugerował, że Sendgrid konwertuje zwykły tekst na HTML, jeśli masz włączony piksel śledzący, co ma sens. Być może znaki nowej linii zostały zniszczone w procesie konwersji zwykłego tekstu na HTML. Zakładam, że klient chce piksela śledzącego, więc zdecydował się przejść na HTML.