Alguma maneira de codificar o URL no comando curl?

107

Eu tenho algum URL que tem espaço em sua consulta param. Eu quero usar isso em curl, por exemplo

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 dá

Malformed Request-Line

De acordo com o meu entendimento o / p é devido ao espaço presente no parâmetro de consulta.

Existe alguma maneira de codificar o URL automaticamente antes de fornecer o comando curl?

Aashish P.
fonte

Respostas:

170

curlsuporta codificação de URL internamente com --data-urlencode:

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

-G também é necessário anexar os dados ao URL.

Rastrear cabeçalhos

> 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
fonte
E se msg = '='?
Aurélien Ooms
Do curl doc: Observe que a parte do nome (neste caso, msg) já deve estar codificada em URL. Além disso, você pode especificar algo como --request DELETE e, de fato, seria um método de exclusão em vez de um GET. Não tenho certeza se o pedido é importante.
Federico
@ damphat o que acontece quando a solicitação tem dois parâmetros como "msg1=Hello&msg2=World"? Isto irá codificar o &entre os parâmetros que significaria coisa errada para enviar para o servidor
Ganesh Satpute
10
@GaneshSatpute: use vários --data-urlencodeparâmetros, um para cada par de valores-chave.
Martijn Pieters
@MartijnPieters Sim. isso funciona. Obrigado pela resposta
Ganesh Satpute
7
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

Onde $URLestá o URL em que você deseja fazer as traduções.

Também há mais de um tipo de tradução (codificação) que você pode ter em uma URL, então você pode querer fazer:

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

em vez de.

Drav Sloan
fonte
1
Observe que echo "$URL" | sed 's/ /%20/'não fará a coisa certa se houver %caracteres no URL. Além disso, os espaços são normalmente codificados como +(e +como %2b). Eu recomendo a solução Perl, que é confiável.
Gilles
1
sed 's/ /%20/g'se você tiver mais de um espaço para traduzir ... #
217 sebthebert
Nota: eu tive que instalar o módulo Perl URI :: Escape.
precisa saber é o seguinte