¿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\nEn 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\nImagine 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
Sin los encabezados correctos, el servidor simplemente no entenderá lo que usted quiere de él.
\n\nMétodo 1: El viejo http.Get (y por qué no es adecuado)
\n\nMuchos principiantes en Go comienzan con http.Get(). Es conveniente para pruebas, pero este método tiene una gran desventaja: no se pueden establecer encabezados.
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\nEste 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.
Método 2: Creamos nuestra propia Request (el camino correcto)
\n\nEn 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.
Aquí está la estructura básica:
\n\npackage 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\nTenga en cuenta: usamos req.Header.Set(), no req.Header.Add(). La diferencia es importante:
- \n
- Set — reemplaza el valor existente (si ese encabezado ya existe) \n
- Add — agrega otro valor al existente (crea un duplicado) \n
Para la mayoría de los casos, use Set — es más seguro.
Método 3: Trabajo con autorización (Bearer Token)
\n\nEl escenario más común es la transmisión de un token JWT. Así es como se hace correctamente:
\n\npackage 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