有什么办法可以在curl命令中编码url?


106

我有一些网址,其中的查询参数中有空格。我想在卷曲中使用它,例如

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是由于查询参数中存在空间。

在提供给curl命令之前,是否有任何方法可以自动对URL进行编码?

Answers:


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 = '='呢?
的Aurelien奥姆斯

从curl文档:请注意,名称部分(在这种情况下为msg)应该已经被URL编码了。您还可以指定--request DELETE之类的名称,它的确是删除方法,而不是GET方法。不确定订单是否重要。
费德里科

@damphat当请求具有两个参数时会发生什么"msg1=Hello&msg2=World"?这将对&参数之间的编码进行编码,这将意味着将错误的内容发送到服务器
Ganesh Satpute

10
@GaneshSatpute:使用多个--data-urlencode参数,每个键值对一个。
马丁·皮特斯

@MartijnPieters是的。这样可行。感谢您的回答
Ganesh Satpute

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

$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解决方案,它是可靠的。
吉尔斯2013年

1
sed 's/ /%20/g'如果您有多个翻译空间...
sebthebert

注意我必须安装Perl URI :: Escape模块。
buzz3791
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.