Метод url.Values.Encode
Метод url.Values.Encode кодирует коллекцию параметров в строку,
пригодную для использования в URL или в теле HTTP-запроса.
В первый аргумент метод не принимает параметров, он действует на
приемнике типа url.Values. Результат - строка, в которой
ключи и значения отсортированы по ключам, а каждый параметр
закодирован в формате "ключ=значение". Специальные символы,
такие как пробелы, символы пунктуации и не-ASCII символы,
заменяются на корректные URL-коды (процентное кодирование).
Стоит отметить, что в отличие от ручного конструирования строк, этот метод гарантирует корректное кодирование, а также автоматически обрабатывает мульти-значения для одного ключа, повторяя ключ для каждого значения.
Синтаксис
func (v Values) Encode() string
Пример
Давайте создадим коллекцию параметров с несколькими ключами и значениями, после чего закодируем ее в строку запроса:
package main
import (
"fmt"
"net/url"
)
func main() {
params := url.Values{}
params.Set("name", "John Doe")
params.Add("age", "30")
params.Add("city", "New York")
res := params.Encode()
fmt.Println(res)
}
Результат выполнения кода:
"age=30&city=New+York&name=John+Doe"
Обратите внимание, что ключи были отсортированы в алфавитном
порядке, а пробелы закодированы как +.
Пример
Рассмотрим случай, когда для одного ключа указано несколько значений.
Метод Encode корректно обработает их, повторив ключ в строке
запроса для каждого значения:
package main
import (
"fmt"
"net/url"
)
func main() {
params := url.Values{}
params.Add("colors", "red")
params.Add("colors", "green")
params.Add("colors", "blue")
params.Set("mode", "list")
res := params.Encode()
fmt.Println(res)
}
Результат выполнения кода:
"colors=blue&colors=green&colors=red&mode=list"
В данном примере ключ colors повторен три раза, каждому
значению соответствует отдельная пара "ключ=значение". Значения
при этом были отсортированы, а не сохранены в порядке добавления.
Пример
Метод также полезен для работы с не-ASCII символами или специальными знаками в значениях параметров. Он самостоятельно применит процентное кодирование:
package main
import (
"fmt"
"net/url"
)
func main() {
params := url.Values{}
params.Set("q", "golang & web")
params.Add("page", "1")
params.Add("filter", "price>100")
res := params.Encode()
fmt.Println(res)
}
Результат выполнения кода:
"filter=price%3E100&page=1&q=golang+%26+web"
Символ > заменен на %3E, а & на %26,
что предотвращает неверный парсинг строки как разделителя параметров.
Смотрите также
-
метод
url.Values.Get,
который получает первое значение для указанного ключа -
метод
url.Values.Set,
который устанавливает значение для ключа, заменяя существующие -
метод
url.Values.Add,
который добавляет новое значение к ключу, сохраняя предыдущие -
функцию
url.QueryEscape,
которая кодирует отдельную строку в формат URL