Будь-який спосіб кодувати URL в команді curl?


106

У мене є URL-адреса, у якій є простір у параметрі запитів. Я хочу використовувати це в завитку, наприклад

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?

Відповіді:


170

curlпідтримує внутрішнє кодування URL за допомогою --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: */*

Що робити, якщо msg = '='?
Aurélien Ooms

З curl doc: Зауважте, що частина імені (в цьому випадку msg) очікується вже кодованою URL-адресою. Також ви можете вказати щось на кшталт --request DELETE, і це дійсно був би метод видалення замість GET. Не впевнений, чи має значення замовлення.
Федеріко

@damphat що відбувається, коли запит має два параметри типу "msg1=Hello&msg2=World"? Це буде кодувати &між параметрами, що означатиме неправильне надсилання на сервер
Ganesh Satpute

10
@GaneshSatpute: використовуйте кілька --data-urlencodeпараметрів, по одному для кожної пари ключ-значення.
Martijn Pieters

@MartijnPieters Так. що працює. Дякую за відповідь
Ganesh Satpute

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

Де $URLURL-адреса, на якій ви хочете зробити переклади.

Існує також кілька типів перекладу (кодування), який ви можете мати в URL-адресі, тому ви можете зробити:

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

замість цього.


1
Зверніть увагу, що в URL-адресі echo "$URL" | sed 's/ /%20/'немає %символів , якщо це буде правильно . Також пробіли зазвичай кодуються як ++як %2b). Я рекомендую рішення Perl, яке є надійним.
Жиль

1
sed 's/ /%20/g'якщо у вас є більше місця для перекладу ...
sebthebert

Примітка. Мені довелося встановити модуль Perl URI :: Escape.
buzz3791
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.