Параметры адреса в Go
После пути в адресе часто идут параметры: имя, знак равенства и значение, несколько пар разделяют амперсандом. Спецсимволы в значениях нужно кодировать, иначе адрес разберется неверно.
Тип url.Values это словарь строк
по ключу. Метод добавления пары кладет значение
в срез под именем, а метод Encode
собирает готовую хвостовую часть без знака
вопроса. Ее дописывают к пути через
? или передают в команду, которая
принимает уже полный адрес.
Соберем запрос с двумя параметрами:
package main
import (
"fmt"
"io"
"log"
"net/http"
"net/url"
)
func main() {
params := url.Values{}
params.Set("q", "go")
params.Set("page", "1")
addr := "https://example.com/search?" + params.Encode()
resp, err := http.Get(addr)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.StatusCode, len(body))
}
Строка Encode даст безопасную форму
"page=1&q=go" с учетом правил
кодирования. Порядок пар может отличаться,
для сервера это обычно не важно.
Тот же прием для локального сервиса с фильтром:
package main
import (
"fmt"
"io"
"log"
"net/http"
"net/url"
)
func main() {
params := url.Values{}
params.Add("tag", "news")
params.Add("tag", "go")
addr := "http://127.0.0.1:8080/items?" + params.Encode()
resp, err := http.Get(addr)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
}
Даны имя параметра id и значение
"42", базовый путь
"http://127.0.0.1:8080/item":
base := "http://127.0.0.1:8080/item"
id := "42"
Соберите полный адрес через url.Values
и выполните запрос, закрыв тело ответа
отложенно.
Дан следующий код:
v := url.Values{}
v.Set("lang", "ru")
tail := v.Encode()
Скажите, что будет в tail и нужен ли
в начале знак вопроса для склейки с путем.
Скажите, чем Set отличается от
Add для одного и того же имени
параметра.