Метод url.Values.Encode

Метод url.Values.Encode кодирует коллекцию параметров в строку, пригодную для использования в URL или в теле HTTP-запроса. В первый аргумент метод не принимает параметров, он действует на приемнике типа url.Values. Результат - строка, в которой ключи и значения отсортированы по ключам, а каждый параметр закодирован в формате "ключ=значение". Специальные символы, такие как пробелы, символы пунктуации и не-ASCII символы, заменяются на корректные URL-коды (процентное кодирование).

Стоит отметить, что в отличие от ручного конструирования строк, этот метод гарантирует корректное кодирование, а также автоматически обрабатывает мульти-значения для одного ключа, повторяя ключ для каждого значения.

Синтаксис

gofunc (v Values) Encode() string

Пример

Давайте создадим коллекцию параметров с несколькими ключами и значениями, после чего закодируем ее в строку запроса:

gopackage 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)
}

Результат выполнения кода:

go"age=30&city=New+York&name=John+Doe"

Обратите внимание, что ключи были отсортированы в алфавитном порядке, а пробелы закодированы как +.

Пример

Рассмотрим случай, когда для одного ключа указано несколько значений. Метод Encode корректно обработает их, повторив ключ в строке запроса для каждого значения:

gopackage 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)
}

Результат выполнения кода:

go"colors=blue&colors=green&colors=red&mode=list"

В данном примере ключ colors повторен три раза, каждому значению соответствует отдельная пара "ключ=значение". Значения при этом были отсортированы, а не сохранены в порядке добавления.

Пример

Метод также полезен для работы с не-ASCII символами или специальными знаками в значениях параметров. Он самостоятельно применит процентное кодирование:

gopackage 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)
}

Результат выполнения кода:

go"filter=price%3E100&page=1&q=golang+%26+web"

Символ > заменен на %3E, а & на %26, что предотвращает неверный парсинг строки как разделителя параметров.

Смотрите также

  • метод url.Values.Get,
    который получает первое значение для указанного ключа
  • метод url.Values.Set,
    который устанавливает значение для ключа, заменяя существующие
  • метод url.Values.Add,
    который добавляет новое значение к ключу, сохраняя предыдущие
  • функцию url.QueryEscape,
    которая кодирует отдельную строку в формат URL