【发布时间】: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,我很惊讶我在 stackoverflow 或互联网搜索上找不到预先存在的答案。
【问题讨论】:
-
urlencode $DATA如果DATA='*'将表现不佳(它会扩展全局,编码文件名列表);必须是"$DATA"。此外,请参阅pubs.opengroup.org/onlinepubs/009695399/basedefs/… 指导方针:变量名称(第四段):Shell 和系统工具对影响其操作的变量使用全大写名称;保留至少一个小写字符的名称供应用程序使用。由于环境变量和 shell 变量共享一个命名空间,这也适用于常规(非导出)名称。 -
顺便说一句,您是否尝试过 Orwellophile 在stackoverflow.com/a/10660730/14122 的“不完全欺骗但密切相关的问题”中的答案?
-
似乎非常接近这个问题:stackoverflow.com/questions/29755942/… 也有一个 perl 解决方案,您可以将其制作成一个函数。
-
到目前为止,是的,我能够找到可以粘贴到 bash 脚本中的
urlencode()(找到 here)的实现。这是一个解决方案,但我怀疑它是否是最好的解决方案。 -
这个答案是唯一的:stackoverflow.com/a/10797966/1839558