Gibt es eine Möglichkeit, die URL mit dem Befehl curl zu codieren?

107

Ich habe eine URL, die Platz in den Abfrageparametern hat. Ich möchte dies in Locken verwenden, z

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"

was raus gibt

Malformed Request-Line

Nach meinem Verständnis ist o / p auf den im Abfrageparameter vorhandenen Platz zurückzuführen.

Gibt es eine Möglichkeit, die URL automatisch zu codieren, bevor der Befehl curl ausgeführt wird?

Aashish P.
quelle

Antworten:

170

curlUnterstützt URL-Codierung intern mit --data-urlencode:

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

-G ist auch erforderlich, um die Daten an die URL anzuhängen.

Verfolgen Sie Header

> 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: */*
Dampfer
quelle
Was wäre , wenn msg = '='?
Aurélien Ooms
From curl doc: Beachten Sie, dass der Namensteil (in diesem Fall msg) voraussichtlich bereits URL-codiert ist. Sie können auch so etwas wie --request DELETE angeben, und es wäre in der Tat eine Löschmethode anstelle von GET. Ich bin mir nicht sicher, ob die Bestellung wichtig ist.
Federico
@damphat was passiert, wenn die Anfrage zwei Parameter wie hat "msg1=Hello&msg2=World"? Dies verschlüsselt die &Parameter, die bedeuten, dass eine falsche
Nachricht
10
@GaneshSatpute: Verwenden Sie mehrere --data-urlencodeParameter, einen für jedes Schlüssel-Wert-Paar.
Martijn Pieters
@MartijnPieters Ja. das funktioniert. Vielen Dank für die Antwort
Ganesh Satpute
7
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

Wo $URList die URL, unter der Sie die Übersetzungen durchführen möchten?

Es gibt auch mehr als eine Art von Übersetzung (Kodierung) in einer URL, daher möchten Sie vielleicht Folgendes tun:

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

stattdessen.

Drav Sloan
quelle
1
Beachten Sie, dass dies echo "$URL" | sed 's/ /%20/'nicht richtig ist, wenn %die URL Zeichen enthält. Leerzeichen werden normalerweise auch als +(und +als %2b) codiert . Ich empfehle die Perl-Lösung, die zuverlässig ist.
Gilles
1
sed 's/ /%20/g'Wenn Sie mehr als ein Leerzeichen zum Übersetzen haben ...
sebthebert
Hinweis Ich musste das Perl URI :: Escape-Modul installieren.
Buzz3791