说我想使用curl
发出以下请求:
https://api.foobar.com/widgets?begin=2018-09-10T01:00:00+01:00&object={"name":"barry"}
该字符串的URL编码版本如下:
https://api.foobar.com/widgets?begin=2018-09-10T01%3A00%3A00%2B01%3A00&object=%7B%22name%22%3A%22barry%22%7D
当然,当我在命令行下发出请求时,我宁愿看一下外观更好(但不是URL有效)的第一个版本。我正在考虑使用bash
脚本来分割漂亮版本的不同部分,对相关部分进行编码,然后将其重新粘合在一起,因此我不必担心。
例如,在?
,&
和=
进行了几轮简单拆分之后,我可以轻松地到达:
https://api.foobar.com/widgets
begin
2018-09-10T01:00:00+01:00
object
{"name":"barry"}
然后,URL对查询字符串的两个值进行编码,并将其重新粘合在一起。 我接受查询字符串中&
和=
的任何出现都会破坏这种方法。
还有什么我需要担心的事情可能会使这成为一个特别愚蠢的想法吗?
答案 0 :(得分:3)
将--data-urlencode
与--get
一起使用
curl --data-urlencode 'begin=2018-09-10T01:00:00+01:00' --data-urlencode 'object={"name":"barry"}' --get 'http://api.foobar.com/widgets'
-G ,-get 使用时,此选项将使所有用-d,--data,--data-binary或--data指定的数据-urlencode将在HTTP GET请求中使用,而不是在其他情况下将使用的POST请求中。数据将以'?'附加到URL。分隔符。
答案 1 :(得分:1)
这是我最后想到的脚本,curl-encoded.sh
:
#!/usr/bin/env bash
#
# Make HTTP request for given URL with query string URL encoded.
#
set -e
# Name args.
URL=$1
if [[ $URL = *"?"* ]]; then
DOMAIN_PATH="${URL%%\?*}";
QUERY_STRING="${URL#*\?}"
else
DOMAIN_PATH=$URL
QUERY_STRING=''
fi
# Split query string into key/value pairs.
IFS='&' read -ra PARAMETERS <<< "$QUERY_STRING"
for PARAMETER in "${PARAMETERS[@]}"; do
URLENCODED_PARAMETERS=("${URLENCODED_PARAMETERS[@]}" "--data-urlencode" "$PARAMETER")
done
# Make request.
curl --silent "${URLENCODED_PARAMETERS[@]/#/}" "${@:2}" --get "$DOMAIN_PATH"
您致电:
./curl-encoded.sh https://api.foobar.com/widgets?foo=bar&object={"name":"barry"}
获取的URL是:
https://api.foobar.com/widgets?foo=bar&object=%7B%22name%22%3A%22barry%22%7D