如何使用bash或curl将数据urlencode到URL中

时间:2016-05-18 20:30:27

标签: bash curl urlencode

如何将字符串urlencoded并嵌入到URL中?请注意,我尝试获取或发布数据,因此curl的-G--data以及--data-urlencode选项似乎没有这份工作。

例如,如果您使用

curl -G http://example.com/foo --data-urlencode "bar=spaced data"

在功能上等同于

curl http://example.com/foo?bar=spaced%20data"

这是不可取的。

我有一个字符串foo/bar,必须是urlencoded foo%2fbar并嵌入到网址中。

curl http://example.com/api/projects/foo%2fbar/events

如果存在某种urlencode函数,那么一个假设的解决方案(如果我能找到这样的东西)就是用bash预处理数据。

DATA=foo/bar
ENCODED=`urlencode $DATA`
curl http://example.com/api/projects/${ENCODED}/events

另一个假设的解决方案(如果我能找到类似的东西)会卷曲一些,类似于:

curl http://example.com/api/projects/{0}/events --string-urlencode "0=foo/bar"

我正在寻找这个问题答案的具体原因是Gitlab API。例如,gitlab get single project NAMESPACE/PROJECT_NAME是URL编码的,例如。 /api/v3/projects/diaspora%2Fdiaspora(其中/%2F表示)。此外,您可以在项目中请求单个属性,因此最终会得到http://example.com/projects/diaspora%2Fdiaspora/events

等网址

虽然这个问题是gitlab特有的,但我认为它一般适用于REST API,我很惊讶我无法找到预先存在的答案。 stackoverflow或互联网搜索。

1 个答案:

答案 0 :(得分:3)

您建议的var dct = text.Trim(';').Split(';').Select(t=>t.Split(':')).ToDictionary(t=>t[0], t=>t[1]); 功能很容易实现:

urlencode

...用作:

urlencode() {
  python -c 'import urllib, sys; print urllib.quote(sys.argv[1], sys.argv[2])' \
    "$1" "$urlencode_safe"
}

如果你想让一些字符按字面顺序传递 - 在许多用例中,这是data=foo/bar encoded=$(urlencode "$data") curl "http://example.com/api/projects/${encoded}/events" s所需要的 - 而是使用:

/