Un modo per codificare l'url nel comando curl?


109

Ho un url che ha spazio nel suo parametro di query. Voglio usarlo in curl, ad es

curl -G "http://localhost:30001/data?zip=47401&utc_begin=2013-8-1 00:00:00&utc_end=2013-8-2 00:00:00&country_code=USA"

che dà fuori

Malformed Request-Line

Secondo la mia comprensione o / p è dovuto allo spazio presente nella query param.

C'è qualche via per codificare automaticamente l'URL prima di fornirlo al comando arricciatura?

Risposte:


173

curlsupporta la codifica url internamente con --data-urlencode:

$ curl -G -v "http://localhost:30001/data" --data-urlencode "msg=hello world" --data-urlencode "msg2=hello world2"

-G è inoltre necessario aggiungere i dati all'URL.

Traccia intestazioni

> GET /data?msg=hello%20world&msg2=hello%20world2 HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu)
> Host: localhost
> Accept: */*

E se msg = '='?
Aurélien Ooms,

Da curl doc: si noti che la parte del nome (msg in questo caso) dovrebbe essere già codificata nell'URL. Inoltre puoi specificare qualcosa come --request DELETE e sarebbe effettivamente un metodo di eliminazione invece di GET. Non sono sicuro se l'ordine conta.
Federico

@damphat cosa succede quando la richiesta ha due parametri simili "msg1=Hello&msg2=World"? Questo codificherà &tra i parametri il che significherebbe cosa sbagliato da inviare al server
Ganesh Satpute,

11
@GaneshSatpute: usa più --data-urlencodeparametri, uno per ogni coppia chiave-valore.
Martijn Pieters,

@MartijnPieters Sì. che funzioni. Grazie per la risposta
Ganesh Satpute,

6
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

Dov'è $URLl'URL su cui vuoi fare le traduzioni.

Esistono anche più tipi di traduzione (codifica) che puoi avere in un URL, quindi potresti voler fare:

curl -G "$(perl -MURI::Escape -e 'print uri_escape shift, , q{^A-Za-z0-9\-._~/:}' -- "$URL")"

anziché.


1
Nota che echo "$URL" | sed 's/ /%20/'non farà la cosa giusta se ci sono %caratteri nell'URL. Inoltre, gli spazi sono normalmente codificati come +(e +come %2b). Consiglio la soluzione Perl, che è affidabile.
Gilles,

1
sed 's/ /%20/g'se hai più di uno spazio da tradurre ...
sebthebert,

Nota ho dovuto installare il modulo Perl URI :: Escape.
buzz3791,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.