Если нам нужно создать 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. Это даст еще большей прозрачности при создании запроса.