如何使用bash或curl将数据编码为URL

问题描述 投票:0回答:3

如何对字符串进行 urlencode 并嵌入到 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
并嵌入到 URL 中。

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

一个假设的解决方案(如果我能找到类似的东西)是在 bash 中预处理数据,如果存在某种

urlencode
函数。

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

另一个假设的解决方案(如果我能找到类似的东西)是在curl中进行一些开关,类似于:

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
表示)。除此之外,您可以请求项目中的各个属性,因此您最终会得到一个 URL,例如
http://example.com/projects/diaspora%2Fdiaspora/events

虽然这个问题是特定于 gitlab 的,但我想它通常适用于一般的 REST API,而且我很惊讶我在 stackoverflow 或互联网搜索上找不到预先存在的答案。

bash curl urlencode
3个回答
14
投票

您提出的

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"

如果您想要一些按字面传递的字符——在许多用例中,这是

/
所需要的——而是使用:

encoded=$(urlencode_safe='/' urlencode "$data")

0
投票

添加到@rici的评论 在接受的答案(比答案本身有更多的赞成票)上,我们可以在

ue
之上创建函数
urlencode
jq
的缩写,但你可以随意称呼它)并使其读取标准输入或来自参数:

ue() {local in=$1; if [ -z "$in" ]; then read in; fi; echo $in|jq -sRr '@uri'}
echo "https://example.com/$(ue "some part")/?date=$(date|ue)"

单行代码,没有Python,只是

jq
,简单明了...


0
投票

Python3 中的单行代码:

python -c "from urllib.parse import quote; print(quote(input('Type here: ')))"
© www.soinside.com 2019 - 2024. All rights reserved.