Любой способ закодировать URL в команде curl?

109

У меня есть некоторый URL, который имеет место в параметре запроса. Я хочу использовать это в curl, например

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"

который выдает

Malformed Request-Line

Согласно моему пониманию, o / p связано с наличием места в параметре запроса.

Есть ли возможность автоматически закодировать URL-адрес перед его передачей команде curl?

Аашиш П.
источник

Ответы:

173

curlподдерживает внутреннее кодирование с помощью --data-urlencode:

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

-G Также необходимо добавить данные в URL.

Заголовки трассировки

> 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
источник
Что если msg = '='?
Орельен Омс
Из curl doc: обратите внимание, что часть имени (в данном случае msg), как ожидается, будет уже закодирована в URL. Также вы можете указать что-то вроде --request DELETE, и это будет действительно метод удаления вместо GET. Не уверен, если порядок имеет значение.
Федерико
@damphat что происходит, когда запрос имеет два параметра, как "msg1=Hello&msg2=World"? Это закодирует &между параметрами, что будет означать неправильную отправку на сервер
Ганеш Сатпут
11
@GaneshSatpute: использовать несколько --data-urlencodeпараметров, по одному для каждой пары ключ-значение.
Мартин Питерс
@MartijnPieters Да. это работает. Спасибо за ответ
Ганеш Сатпут
6
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

Где $URLнаходится URL, на который вы хотите сделать перевод.

Существует также более одного типа перевода (кодировки), который вы можете иметь в URL, поэтому вы можете сделать следующее:

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

вместо.

Драв Слоан
источник
1
Обратите внимание, что echo "$URL" | sed 's/ /%20/'это не будет делать правильно, если %в URL есть символы. Кроме того, пробелы обычно кодируются как ++как %2b). Я рекомендую решение Perl, которое является надежным.
Жиль
1
sed 's/ /%20/g'если у вас есть более одного пробела для перевода ...
Себтеберт
Обратите внимание, я должен был установить модуль Perl URI :: Escape.
buzz3791