【问题标题】:Is it sensible to automatically URL encode query parameters in a string?在字符串中自动对查询参数进行 URL 编码是否明智?
【发布时间】:2018-09-20 17:29:39
【问题描述】:

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

还有什么我应该担心的可能会使这个想法变得特别愚蠢的吗?

【问题讨论】:

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


    【解决方案1】:

    --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分隔符。

    【讨论】:

    • 感谢@oguzismail,最终启发了我的剧本(见我的回答)。
    【解决方案2】:

    这是我最后想出的脚本,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"}
    

    获取的网址是:

    https://api.foobar.com/widgets?foo=bar&object=%7B%22name%22%3A%22barry%22%7D
    

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 2014-11-16
      • 2016-07-07
      • 1970-01-01
      • 2014-01-20
      • 2012-06-02
      相关资源
      最近更新 更多