如何使用 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为例)

cura-engine学习

如何使用 nginx proxy_pass 保留请求 url

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

如何将文件接收地址AS2 URL中的HTTP修改为HTTPS?