如何对字符串进行 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 或互联网搜索上找不到预先存在的答案。
您提出的
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")
添加到@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
,简单明了...
Python3 中的单行代码:
python -c "from urllib.parse import quote; print(quote(input('Type here: ')))"