Опубликовано: 18 апреля 2022 г. 21:49 | Автор: echodiv | Категория: Разработка | 👁 675

Создание GET запроса с параметрами в Go

Если нам нужно создать GET запрос в Go с query параметрами, то можно столкнуться с неожиданными трудностями.

Самый простой вариант, это создать строку содержащую параметры и передать её как эндпоинт в метод запроса. Это будет выглядеть следующим образом:

package main
 
import (
	"fmt"
	"net/http"
)
 
func main() {
	apiKey := "mySuperAwesomeApiKey"
	url := fmt.Sprintf("http://xztvc.ru/endpoint?api_key=%s", apiKey)
 
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}      

fmt.Println(req.URL.String()) }

 

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

package main
 
import (
	"fmt"
	"net/http"
)
 
func main() {
	req, err := http.NewRequest("GET", "http://xztvc.ru/endpoint", nil)
	if err != nil {
		panic(err)
	}
 
	q := req.URL.Query()
	q.Add("api_key", "mySuperAwesomeApiKey")
	q.Add("another_key", "qwerty")
	req.URL.RawQuery = q.Encode()
 
	fmt.Println(req.URL.String())
}

Здесь мы уже используем специальные методы для добавления query параметров. Так же мы вызываем метод Encode, который гарантирует нам валидность query параметров в URL.

 

Можно пойти и дальше, вынести функционал добавления параметров в отдельную функцию, сами параметры хранить в map[string]string. Это даст еще большей прозрачности при создании запроса.