Cliente HTTP en Go: haciendo solicitudes correctamente

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción

Go (Golang) es un lenguaje compilado moderno de Google, ideal para crear servicios de red de alta carga. El paquete integrado net/http proporciona un cliente HTTP potente y flexible que permite interactuar fácilmente con APIs REST, servidores web y otros recursos HTTP. Sin embargo, a pesar de su aparente simplicidad, los principiantes suelen cometer errores típicos: olvidan cerrar el cuerpo de la respuesta, no manejan los tiempos de espera o ignoran los errores.

En este artículo, analizaremos cómo usar correctamente el cliente HTTP en Go. Aprenderá a realizar solicitudes GET y POST, gestionar cabeceras, configurar tiempos de espera y manejar errores. Todos los ejemplos de código están listos para usar en sus proyectos.



1. Fundamentos: Solicitud GET y lectura de la respuesta

La forma más sencilla de realizar una solicitud GET es usar la función http.Get(). Sin embargo, para código de producción, se recomienda crear una instancia propia de http.Client; esto proporciona más control sobre el comportamiento del cliente.



Solicitud GET simple

package main

import ( "fmt" "io" "net/http" "os")

func main() { // Creamos el cliente (por ahora con configuración por defecto) client := &http.Client{} // Realizamos la solicitud GET resp, err := client.Get("https://api.example.com/data") if err != nil { fmt.Fprintf(os.Stderr, "Error de solicitud: %v", err) os.Exit(1) } // IMPORTANTE: cerramos el cuerpo de la respuesta defer resp.Body.Close()

// Leemos el cuerpo de la respuesta body, err := io.ReadAll(resp.Body) if err != nil { fmt.Fprintf(os.Stderr, "Error al leer el cuerpo: %v", err) os.Exit(1) }

fmt.Printf("Estado: %s", resp.Status) fmt.Printf("Cuerpo: %s", body)}


Puntos clave:

  • defer resp.Body.Close() — es obligatorio cerrar el cuerpo de la respuesta, de lo contrario se producirá una fuga de recursos (la conexión no volverá al pool).
  • Verifique siempre err — la red es inestable y la solicitud puede fallar.
  • Verifique el estado HTTP de la respuesta (resp.StatusCode) para distinguir entre éxito (2xx) y errores del servidor (4xx, 5xx).


2. Solicitud POST con cuerpo y cabeceras

Para enviar datos al servidor (por ejemplo, JSON), se usa http.Post() o el método más flexible http.NewRequest() seguido de la llamada a client.Do(). La segunda opción es preferible, ya que permite establecer cabeceras y otros parámetros.



POST con datos JSON

package main

import ( "bytes" "encoding/json" "fmt" "net/http" "os")

type User struct { Name string `json:"name"` Email string `json:"email"`}

func main() { client := &http.Client{}

// Preparamos los datos user := User{Name: "Iván Petrov", Email: "ivan@example.com"} jsonData, err := json.Marshal(user) if err != nil { fmt.Fprintf(os.Stderr, "Error de serialización JSON: %v", err) os.Exit(1) }

// Creamos la solicitud req, err := http.NewRequest("POST", "https://api.example.com/users", bytes.NewBuffer(jsonData)) if err != nil { fmt.Fprintf(os.Stderr, "Error al crear la solicitud: %v", err) os.Exit(1) }

// Establecemos las cabeceras req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer YOUR_TOKEN_HERE")

// Enviamos la solicitud resp, err := client.Do(req) if err != nil { fmt.Fprintf(os.Stderr, "Error de solicitud: %v", err) os.Exit(1) } defer resp.Body.Close()

// Verificamos el estado if resp.StatusCode != http.StatusCreated { fmt.Fprintf(os.Stderr, "El servidor devolvió un error: %s", resp.Status) os.Exit(1) }

fmt.Println("¡Usuario creado exitosamente!")}


Import

Blogs

Book Recommendations