Cómo establecer encabezados en una solicitud HTTP GET en Go: guía completa

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

¿Cómo establecer encabezados en una solicitud HTTP GET en Go? Explicación completa con código

\n\n

¿Alguna vez ha intentado enviar una solicitud HTTP GET a un servidor y este devolvió un error de autorización? ¿O tal vez la API ignoró su solicitud, aunque sabía con certeza que debería funcionar? En el 90% de los casos, el problema está en los encabezados HTTP. Son como un pase para una fiesta: sin el documento correcto, simplemente no lo dejarán entrar.

\n\n

En este artículo, analizaremos cómo gestionar profesionalmente los encabezados en solicitudes HTTP GET en Go (Golang). Aprenderá no solo la sintaxis básica, sino también las trampas típicas en las que incluso los desarrolladores experimentados caen. ¡Allá vamos!

\n\n

¿Por qué son importantes los encabezados?

\n\n

Imagine que una solicitud HTTP es un sobre con una carta. El sobre en sí (el cuerpo de la solicitud) puede estar vacío, pero la información en él (los encabezados) lo decide todo:

\n
    \n
  • Content-Type — formato de datos (JSON, XML, Form)
  • \n
  • Authorization — clave de acceso a la API (Bearer token, Basic Auth)
  • \n
  • User-Agent — identificación del cliente (para que no lo bloqueen como bot)
  • \n
  • Accept — qué formato de respuesta espera
  • \n
\n

Sin los encabezados correctos, el servidor simplemente no entenderá lo que usted quiere de él.

\n\n

Método 1: El viejo http.Get (y por qué no es adecuado)

\n\n

Muchos principiantes en Go comienzan con http.Get(). Es conveniente para pruebas, pero este método tiene una gran desventaja: no se pueden establecer encabezados.

\n\n
package main\n\nimport (\n    "fmt"\n    "io/ioutil"\n    "net/http"\n)\n\nfunc main() {\n    // ¡Así no se pueden agregar encabezados!\n    resp, err := http.Get("https://api.example.com/data")\n    if err != nil {\n        panic(err)\n    }\n    defer resp.Body.Close()\n\n    body, _ := ioutil.ReadAll(resp.Body)\n    fmt.Println(string(body))\n}\n
\n\n

Este código simplemente envía una solicitud «desnuda». Si la API requiere un token de autorización, obtendrá un 401 Unauthorized. Para proyectos reales, este enfoque no sirve.

\n\n

Método 2: Creamos nuestra propia Request (el camino correcto)

\n\n

En Go, para el ajuste fino de las solicitudes se utiliza el constructor http.NewRequest(). Devuelve un objeto *http.Request con el que se puede hacer cualquier cosa, incluido establecer encabezados.

\n\n

Aquí está la estructura básica:

\n\n
package main\n\nimport (\n    "fmt"\n    "io/ioutil"\n    "net/http"\n)\n\nfunc main() {\n    // 1. Creamos la URL\n    url := "https://api.github.com/users/golang"\n\n    // 2. Creamos una nueva solicitud GET\n    req, err := http.NewRequest("GET", url, nil)\n    if err != nil {\n        panic(err)\n    }\n\n    // 3. Establecemos los encabezados\n    req.Header.Set("User-Agent", "MyGoApp/1.0")\n    req.Header.Set("Accept", "application/json")\n\n    // 4. Enviamos la solicitud a través del cliente HTTP\n    client := &http.Client{}\n    resp, err := client.Do(req)\n    if err != nil {\n        panic(err)\n    }\n    defer resp.Body.Close()\n\n    body, _ := ioutil.ReadAll(resp.Body)\n    fmt.Println(string(body))\n}\n
\n\n

Tenga en cuenta: usamos req.Header.Set(), no req.Header.Add(). La diferencia es importante:

\n
    \n
  • Set — reemplaza el valor existente (si ese encabezado ya existe)
  • \n
  • Add — agrega otro valor al existente (crea un duplicado)
  • \n
\n

Para la mayoría de los casos, use Set — es más seguro.

\n\n

Método 3: Trabajo con autorización (Bearer Token)

\n\n

El escenario más común es la transmisión de un token JWT. Así es como se hace correctamente:

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n)\n\nfunc main() {\n    token := "your_jwt_token_here"\n    url := "https://api.example.com/protected"\n\n    req, _ := http.NewRequest("GET", url, nil)\n\n    // Establecemos el encabezado Authorization\n    req.Heade                

Blogs

Book Recommendations