Jakiś sposób zakodować adres URL w poleceniu curl?


106

Mam trochę adresu URL, który ma miejsce w jego parametrze zapytania. Chcę tego użyć w curl, np

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"

co daje

Malformed Request-Line

Zgodnie z moim zrozumieniem o / p wynika z miejsca występującego w param zapytania.

Czy jest jakiś sposób na automatyczne zakodowanie adresu URL przed przekazaniem go do polecenia curl?

Odpowiedzi:


170

curlobsługuje kodowanie adresów URL wewnętrznie za pomocą --data-urlencode:

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

-G jest również konieczne, aby dołączyć dane do adresu URL.

Śledź nagłówki

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

Co jeśli msg = '='?
Aurélien Ooms

Z curl doc: Zauważ, że część nazwy (w tym przypadku msg) powinna być już zakodowana w adresie URL. Możesz także określić coś w rodzaju --request DELETE i rzeczywiście byłaby to metoda usuwania zamiast GET. Nie jestem pewien, czy zamówienie ma znaczenie.
Federico

@ wilgotne co się dzieje, gdy żądanie ma dwa parametry, takie jak "msg1=Hello&msg2=World"? Spowoduje to zakodowanie &między parametrami, które oznaczałyby niewłaściwą rzecz do wysłania na serwer
Ganesh Satpute,

10
@GaneshSatpute: użyj wielu --data-urlencodeparametrów, po jednym dla każdej pary klucz-wartość.
Martijn Pieters,

@MartijnPieters Tak. to działa. Dzięki za odpowiedź
Ganesh Satpute,

7
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

Gdzie $URLjest adres URL, na którym chcesz wykonać tłumaczenia.

Istnieje również więcej niż jeden rodzaj tłumaczenia (kodowania) w adresie URL, więc możesz chcieć:

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

zamiast.


1
Pamiętaj, że echo "$URL" | sed 's/ /%20/'nie zrobi to dobrze, jeśli %w adresie URL są znaki. Ponadto spacje są zwykle kodowane jako +(i +jako %2b). Polecam niezawodne rozwiązanie Perla.
Gilles

1
sed 's/ /%20/g'jeśli masz więcej niż jedno miejsce do przetłumaczenia ...
Wrzesień

Uwaga Musiałem zainstalować moduł Perl URI :: Escape.
buzz3791,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.