Есть ли смысл автоматически URL-кодировать параметры запроса в строке? - PullRequest
0 голосов
/ 20 сентября 2018

Скажем, я хочу сделать следующий запрос, используя 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, чтобы разделить разные части хорошей версии, закодировать соответствующие, а затем склеить их вместе, чтобы мне не пришлось об этом беспокоиться.

ДляНапример, после пары раундов простого разбиения на ?, & и = я легко могу получить:

И после этого URL кодирует два значения строки запроса и склеивает еевсе вместе. Я принимаю, что любые вхождения & и = в строке запроса нарушат этот подход.

Есть ли что-то еще, о чем я должен беспокоиться, что может сделать эту идею особенно глупой?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Это скрипт, который я придумал в конце, 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
0 голосов
/ 20 сентября 2018

Использовать --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 , - получить При использовании эта опция сделает все данныеопределяется с помощью -d, --data, --data-binary или --data-urlencode для использования в запросе HTTP GET вместо запроса POST, который в противном случае использовался бы.Данные будут добавлены в URL с помощью символа «?»разделитель.

...