Un moyen d'encoder l'url dans la commande curl?

109

J'ai une URL qui a un espace dans son paramètre de requête. Je veux utiliser ceci en boucle, par exemple

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"

ce qui donne

Malformed Request-Line

Selon ma compréhension, o / p est dû à l'espace présent dans query param.

Est-il possible d’encoder l’URL automatiquement avant de l’envoyer à la commande curl?

Aashish P.
la source

Réponses:

173

curlsupporte le codage d'URL en interne avec --data-urlencode:

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

-G Il est également nécessaire d’ajouter les données à l’URL.

En-têtes de trace

> 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: */*
mouiller
la source
Et si msg = '='?
Aurélien Ooms
De curl doc: Notez que le nom de la partie (msg dans ce cas) devrait déjà être encodé en URL. Vous pouvez aussi spécifier quelque chose comme --request DELETE et il s'agirait bien d'une méthode de suppression plutôt que d'une méthode GET. Pas sûr que l'ordre soit important.
Federico
@damphat Que se passe-t-il lorsque la requête a deux paramètres comme "msg1=Hello&msg2=World"? Cela encodera &entre les paramètres ce qui voudrait dire une mauvaise chose à envoyer au serveur
Ganesh Satpute
11
@GaneshSatpute: utilisez plusieurs --data-urlencodeparamètres, un pour chaque paire clé-valeur.
Martijn Pieters
@ MartijnPieters Oui. ça marche. Merci pour la réponse
Ganesh Satpute
6
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

$URLest l'URL sur laquelle vous voulez faire les traductions.

Il existe également plusieurs types de traduction (encodage) que vous pouvez avoir dans une URL, vous pouvez donc effectuer les tâches suivantes:

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

au lieu.

Drav Sloan
la source
1
Notez que echo "$URL" | sed 's/ /%20/'cela ne fera pas la bonne chose s'il y a des %caractères dans l'URL. De plus, les espaces sont normalement codés comme +(et +comme %2b). Je recommande la solution Perl, qui est fiable.
Gilles
1
sed 's/ /%20/g'si vous avez plus d'un espace pour traduire ...
sebthebert
Remarque: j'ai dû installer le module Perl URI :: Escape.
buzz3791