HTTP-клиент для Go (Golang): обзор и сравнение лучших библиотек
Go (Golang) — один из самых популярных языков для создания высоконагруженных веб-сервисов, микросервисов и API-интеграций. Работа с HTTP-запросами — базовая задача практически любого бэкенда. В стандартной библиотеке Go уже есть мощный пакет net/http, но для сложных сценариев (автоматические ретраи, пулы соединений, удобный fluent-интерфейс) разработаны специализированные библиотеки. В этой статье мы разберём топ HTTP-клиентов для Go: их особенности, производительность и примеры использования.
1. Стандартный net/http — основа основ
Пакет net/http встроен в Go и не требует установки. Он полностью покрывает базовые потребности: отправка GET/POST запросов, работа с заголовками, куками, таймаутами. Однако для продвинутого использования (например, пул соединений с настройками) требуется ручная конфигурация http.Transport.
package main
import (
"fmt"
"io"
"net/http"
"time"
)
func main() {
client := &http.Client{
Timeout: 10 * time.Second,
Transport: &http.Transport{
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
DisableCompression: false,
},
}
resp, err := client.Get("https://api.github.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println("Status:", resp.StatusCode)
fmt.Println("Body length:", len(body))
}
Плюсы: нулевая зависимость, полный контроль, поддержка HTTP/2, встроенные middleware через обёртки RoundTripper.
Минусы: многословный код для простых запросов, нет fluent-интерфейса, сложно настраивать ретраи и десериализацию JSON.
2. resty — простой и элегантный REST-клиент
Библиотека resty (установка: go get github.com/go-resty/resty/v2) — один из самых популярных HTTP-клиентов в Go. Предоставляет fluent-интерфейс, автоматическую десериализацию JSON/XML, удобные цепочки вызовов.
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
client := resty.New()
client.SetBaseURL("https://jsonplaceholder.typicode.com")
var users []User
resp, err := client.R().
SetResult(&users).
Get("/users")
if err != nil {
panic(err)
}
fmt.Println("Status:", resp.StatusCode())
fmt.Println("First user:", users[0].Name)
}
Плюсы: лаконичный синтаксис, встроенная поддержка ретраев, таймаутов, прокси, автоматическая обработка ошибок, работа с multipart/form-data.
Минусы: немного медленнее net/http на высоких нагрузках (из-за абстракций), не поддерживает HTTP/3.
3. grequests — Go-версия популярного Python-клиента
grequests (установка: go get github.com/levigross/grequests) вдохновлён Python Requests. Предоставляет простой API для GET, POST, PUT, DELETE, поддерживает сессии, куки, автоматическую обработку JSON.
package main
import (
"fmt"
"github.com/levigross/grequests"
)
func main() {
resp, err := grequests.Get("https://httpbin.org/get", &grequests.RequestOptions{
Headers: map[string]string{"Accept": "application/json"},
})
if err != nil {
panic(err)
}
var data map[string]interface{}
resp.JSON(&data)
fmt.Println("URL:", data["url"])
}
Плюсы: минималистичный код, удобная работа с JSON, поддержка файловых загрузок.
Минусы: проект обновляется реже, чем resty, нет встроенных ретраев и гибкого управления пулом соединений.
4. fasthttp — максимальная производительность
Библиотека fasthttp от разработчиков Valyala (установка: go get github.com/valyala/fasthttp) — это высокопроизводительный HTTP-клиент и сервер. Оптимизирована для работы с большим количеством соединений, минимизирует аллокации памяти. Использует собственный буферизированный парсер.
package main
import (
"fmt"
"github.com/val