Ho provato quanto segue per inviare un'interruzione di riga con curl, ma \n
non viene interpretato da curl.
curl -X PUT -d "my message\n" http://localhost:8000/hello
Come posso inviare un'interruzione di riga con curl?
Risposte:
A volte si desidera fornire i dati da inviare alla lettera.
L' --data-binary
opzione lo fa.
-d @message.txt
come suggerito nell'altra risposta in particolare può alterare le interruzioni di riga. --data-binary
d'altra parte non (che è importante se è necessario mantenere i vostri interruzione di linea CRLF per multipart / form-data, vedi: 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
Il tuo guscio sta passando \
seguito da n
piuttosto che da una nuova riga da arricciare piuttosto che "my message\n"
. Bash supporta un'altra sintassi delle stringhe che supporta sequenze di escape come \n
e \t
. Per usarlo, inizia la stringa con $'
e termina la stringa con '
:
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Vedere ANSI-C Quoting nel Bash Reference Manual
my message\n
parola per parola, non con due escape come dici tu.
my message\n
sia lo stesso a cui mi riferisco "my message\n"
.
\n
non ha nulla a che fare con JavaScript. In effetti niente qui ha niente a che fare con JavaScript.
C'è un modo molto più semplice!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Ciò utilizzerà ANSI-C virgolette per inserire il carattere di nuova riga.
Nessuna tubazione, nessun file di dati. Vedi anche Invio di newline con cURL .
La soluzione per qualcuno che non vuole usare i file e non vuole ricorrere alla magia dell'escape della shell è:
curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF
Ma si tratta di una nuova riga letterale nel payload post data e non nei campi modulo.
@
sia per indicare un nome di file, ma c'è un significato speciale quando lo uso @-
? Cosa sta <<EOF
facendo?
@-
dice a curl di consumare l'input dallo standard in ed <<EOF
è l'indicatore di fine stream per bash. Successivamente utilizziamo la parola magica EOF
nel payload dei dati per dire a bash che abbiamo finito di scrivere nel flusso.
-
è una specie di modo standard in GNU / Linux per specificare STDIN quando è previsto un nome di file. Non è universale, ma è piuttosto comune.
Ha avuto un problema simile. Durante il caricamento del file csv dal Mac al cloud storage, le nuove righe venivano rimosse. Dopo averlo scaricato, l'intero file sembrava una singola riga. Ho provato ad aggiungere diversi caratteri EOL '\ n' '\ r' '\ r \ n' senza successo. L'uso di "--data-binary" invece di "-d" ha risolto il problema. Btw questo problema si è verificato solo da Mac. '-d' ha funzionato perfettamente durante la chiamata dalla macchina CentOS. Questo sembra molto dovuto al carattere di nuova riga del Mac. Ma non ho più voglia di eseguire il debug.
Grazie mille per il vostro aiuto.
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 @
ha risolto il mio problema (inviando un file .ics su più righe a un server CalDAV).
(Sono finito qui con una domanda leggermente diversa, quindi pubblicherò la mia risposta perché potrebbe aiutare i futuri esploratori)
La mia soluzione si applica alle persone che inviano dati in stile modulo, ovvero coppie chiave / valore in una stringa di query. Usa l'interruzione di riga codificata, che è %0A
, proprio come lo spazio codificato %20
. Puoi utilizzare http://meyerweb.com/eric/tools/dencoder/ per convertire altri simboli.
Quindi, se vuoi impostare la chiave message
sul valore:
line one
another
invieresti
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
Non una risposta alla tua domanda, ma ci aggirerei creando un file temporaneo contenente il messaggio e l'interruzione di riga e darei a curl quel file su cui lavorare:
curl -X PUT -d @message.txt http://localhost:8000/hello
Dal manuale :
Se inizi i dati con la lettera @, il resto dovrebbe essere un nome di file da cui leggere i dati, o - se vuoi che curl legga i dati da stdin. Il contenuto del file deve essere già codificato in URL. È inoltre possibile specificare più file. L'invio di dati da un file denominato "foobar" verrebbe quindi eseguito con --data @foobar.
--data-binary
è un'alternativa più fedele a -d
, poiché invierà i dati alla lettera.
-d @/path/to/temp/file.txt
NON risolve il problema dell'interruzione di riga. --data-binary
fa, vedi sopra.
Un modo molto semplice, basta premere Maiusc-Invio nella console per la pausa. Molto leggibile anche digitandolo.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
Fai questo per rimuovere l'interruzione di riga:
curl -d "line1 \
line2" http-echo.com
Server gets this: line1 line2
Stavo usando Sendgrid con questo codice (copiato sotto) originariamente trovato qui https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
funzionava in Gmail, ma è \n
stato ignorato. Ho provato a raddoppiare la fuga e altri suggerimenti. Ho anche provato \r\n
e anche questo non ha funzionato in Gmail. Nota: non mi sono preoccupato di testare altri client di posta elettronica, forse era un problema specifico di 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!"}]}'
Alla fine ho rinunciato a cercare una soluzione e ho cambiato i tag text/plain
a text/html
e ho usato <br />
.
Qualcuno ha suggerito che Sendgrid converta il testo in chiaro in HTML se hai un pixel di tracciamento abilitato, il che ha senso. Forse le nuove righe sono state distrutte nel processo di conversione da testo semplice a HTML. Presumo che il cliente desideri un pixel di tracciamento, quindi ha deciso di passare all'HTML.