Edw*_*vey 2 bash curl urlencode
如何对字符串进行urlencode并将其嵌入到URL中?请注意,我并不是要获取或发布数据,因此curl 的-Gand --data和--data-urlencode选项似乎并没有起作用。
例如,如果您使用
curl -G http://example.com/foo --data-urlencode "bar=spaced data"
Run Code Online (Sandbox Code Playgroud)
在功能上等同于
curl http://example.com/foo?bar=spaced%20data"
Run Code Online (Sandbox Code Playgroud)
这是不希望的。
我有一个foo/bar必须经过urlencode foo%2fbar并嵌入到URL中的字符串。
curl http://example.com/api/projects/foo%2fbar/events
Run Code Online (Sandbox Code Playgroud)
一个假设的解决方案(如果我可以找到类似的东西)将是在bash中预处理数据(如果存在某种urlencode功能的话)。
DATA=foo/bar
ENCODED=`urlencode $DATA`
curl http://example.com/api/projects/${ENCODED}/events
Run Code Online (Sandbox Code Playgroud)
另一个假设的解决方案(如果我能找到类似的东西)将是卷曲的切换,类似于以下内容:
curl http://example.com/api/projects/{0}/events --string-urlencode "0=foo/bar"
Run Code Online (Sandbox Code Playgroud)
我正在寻找这个问题的答案的特定原因是Gitlab API。例如,gitlab get单个项目 NAMESPACE/PROJECT_NAME是URL编码的,例如。/api/v3/projects/diaspora%2Fdiaspora(其中/以表示%2F)。除此之外,您可以请求项目中的各个属性,因此最终得到一个URL,例如http://example.com/projects/diaspora%2Fdiaspora/events
尽管这个问题是特定于gitlab的,但我想它通常总体上适用于REST API,而令我惊讶的是我找不到关于stackoverflow或Internet搜索的预先存在的答案。
urlencode您提出的功能很容易实现:
urlencode() {
python -c 'import urllib, sys; print urllib.quote(sys.argv[1], sys.argv[2])' \
"$1" "$urlencode_safe"
}
Run Code Online (Sandbox Code Playgroud)
...用作:
data=foo/bar
encoded=$(urlencode "$data")
curl "http://example.com/api/projects/${encoded}/events"
Run Code Online (Sandbox Code Playgroud)
如果您希望某些字面值通过字面传递-在许多情况下,这对于/s 是理想的-而是使用:
encoded=$(urlencode_safe='/' urlencode "$data")
Run Code Online (Sandbox Code Playgroud)