如何使用 bash 或 curl 将数据 urlencode 到 URL
Posted
技术标签:
【中文标题】如何使用 bash 或 curl 将数据 urlencode 到 URL【英文标题】:How to urlencode data into a URL, with bash or curl 【发布时间】:2016-09-15 12:38:38 【问题描述】:如何将字符串进行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
并嵌入到 URL 中。
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 中的一些开关,类似于:
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,我很惊讶我在 *** 或互联网搜索上找不到预先存在的答案。
【问题讨论】:
urlencode $DATA
如果DATA='*'
将表现不佳(它会扩展全局,编码文件名列表);必须是"$DATA"
。此外,请参阅pubs.opengroup.org/onlinepubs/009695399/basedefs/… 指导方针:变量名称(第四段):Shell 和系统工具对影响其操作的变量使用全大写名称;保留至少一个小写字符的名称供应用程序使用。由于环境变量和 shell 变量共享一个命名空间,这也适用于常规(非导出)名称。
顺便说一句,您是否尝试过 Orwellophile 在***.com/a/10660730/14122 的“不完全欺骗但密切相关的问题”中的答案?
似乎非常接近这个问题:***.com/questions/29755942/… 也有一个 perl 解决方案,您可以将其制作成一个函数。
到目前为止,是的,我能够找到可以粘贴到 bash 脚本中的 urlencode()
(找到 here)的实现。这是一个解决方案,但我怀疑它是否是最好的解决方案。
这个答案是唯一的:***.com/a/10797966/1839558
【参考方案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 需要这样做——改为使用:
encoded=$(urlencode_safe='/' urlencode "$data")
【讨论】:
FWIW,如果你碰巧安装了jq
,你可以使用稍短的printf %s "$1" | jq -s -R -r @uri
好把戏;短一点(-s
似乎没有必要,但我不确定):jq -R -r @uri <<<"$1"
以上是关于如何使用 bash 或 curl 将数据 urlencode 到 URL的主要内容,如果未能解决你的问题,请参考以下文章
3D打印机USB联机打印是如何实现的?(以Cura插件USBPrinting为例)
3D打印机USB联机打印是如何实现的?(以Cura插件USBPrinting为例)
如何使用 nginx proxy_pass 保留请求 url