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?

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: */*

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.