¿Alguna forma de codificar la url en el comando curl?

109

Tengo alguna url que tiene espacio en su parámetro de consulta. Quiero usar esto en curl, por ejemplo

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"

que da

Malformed Request-Line

Según mi entendimiento, o / p se debe al espacio presente en el parámetro de consulta.

¿Hay alguna forma de codificar la url automáticamente antes de proporcionarla al comando curl?

Aashish P.
fuente

Respuestas:

173

curladmite codificación de URL internamente con --data-urlencode:

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

-G También es necesario agregar los datos a la URL.

Rastrear encabezados

> 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: */*
Damphat
fuente
¿Y si msg = '='?
Aurélien Ooms
De curl doc: tenga en cuenta que se espera que la parte del nombre (msg en este caso) ya esté codificada en URL. También puede especificar algo como --request DELETE y de hecho sería un método de eliminación en lugar de un GET. No estoy seguro si el orden importa.
Federico
@damphat, ¿qué sucede cuando la solicitud tiene dos parámetros "msg1=Hello&msg2=World"? Esto codificará &entre los parámetros que significarían algo incorrecto para enviar al servidor
Ganesh Satpute
11
@GaneshSatpute: use múltiples --data-urlencodeparámetros, uno para cada par clave-valor.
Martijn Pieters
@MartijnPieters Sí. eso funciona. Gracias por la respuesta
Ganesh Satpute
6
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

¿Dónde $URLestá la url en la que quieres hacer las traducciones?

También hay más de un tipo de traducción (codificación) que puede tener en una URL, por lo que puede hacer lo siguiente:

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

en lugar.

Drav Sloan
fuente
1
Tenga en cuenta que echo "$URL" | sed 's/ /%20/'no hará lo correcto si hay %caracteres en la URL. Además, los espacios normalmente se codifican como +(y +como %2b). Recomiendo la solución Perl, que es confiable.
Gilles
1
sed 's/ /%20/g'si tiene más de un espacio para traducir ...
sebthebert
Tenga en cuenta que tuve que instalar el módulo Perl URI :: Escape.
buzz3791