Cliente HTTP para Go (Golang): resumen y comparación de las mejores bibliotecas
Go (Golang) es uno de los lenguajes más populares para crear servicios web de alta carga, microservicios e integraciones de API. Trabajar con solicitudes HTTP es una tarea básica de casi cualquier backend. En la biblioteca estándar de Go ya existe un potente paquete net/http, pero para escenarios complejos (reintentos automáticos, pools de conexiones, interfaz fluent cómoda) se han desarrollado bibliotecas especializadas. En este artículo analizaremos los mejores clientes HTTP para Go: sus características, rendimiento y ejemplos de uso.
1. Estándar net/http — la base de todo
El paquete net/http está integrado en Go y no requiere instalación. Cubre completamente las necesidades básicas: envío de solicitudes GET/POST, trabajo con cabeceras, cookies, tiempos de espera. Sin embargo, para un uso avanzado (por ejemplo, pool de conexiones con configuraciones) se requiere configuración manual de 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))}Ventajas: cero dependencias, control total, soporte HTTP/2, middleware integrado a través de envoltorios RoundTripper.
Desventajas: código verboso para solicitudes simples, no tiene interfaz fluent, difícil configurar reintentos y deserialización JSON.
2. resty — cliente REST simple y elegante
La biblioteca resty (instalación: go get github.com/go-resty/resty/v2) es uno de los clientes HTTP más populares en Go. Proporciona una interfaz fluent, deserialización automática JSON/XML, cadenas de llamadas convenientes.
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)}Ventajas: sintaxis concisa, soporte integrado de reintentos, tiempos de espera, proxy, manejo automático de errores, trabajo con multipart/form-data.
Desventajas: un poco más lento que net/http bajo cargas altas (debido a las abstracciones), no soporta HTTP/3.
3. grequests — versión Go del popular cliente Python
grequests (instalación: go get github.com/levigross/grequests) está inspirado en Python Requests. Proporciona una API simple para GET, POST, PUT, DELETE, soporta sesiones, cookies, procesamiento automático de 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"])}Ventajas: código minimalista, trabajo conveniente con JSON, soporte de carga de archivos.
Desventajas: proyecto
También en la biblioteca
Trabajo con CSV en Swift (iOS/macOS): bibliotecas y ejemplos
WorkManager para Kotlin: guía completa con ejemplos
Biblioteca estándar de JavaScript (Node.js): revisión completa
Trabajo con Kafka en Swift (iOS/macOS): bibliotecas, clientes y ejemplos