自动对字符串中的查询参数进行URL编码是否明智?

时间:2018-09-20 17:29:39

标签: bash url curl url-encoding url-parameters

说我想使用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对查询字符串的两个值进行编码,并将其重新粘合在一起。 我接受查询字符串中&=的任何出现都会破坏这种方法。

还有什么我需要担心的事情可能会使这成为一个特别愚蠢的想法吗?

2 个答案:

答案 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