Como definir cabeçalhos em uma requisição HTTP GET em Go? Explicação completa com código
\n\nVocê já tentou enviar uma requisição HTTP GET para um servidor e ele retornou um erro de autenticação? Ou talvez a API ignorou sua requisição, mesmo você sabendo que ela deveria funcionar? Em 90% dos casos, o problema está nos cabeçalhos HTTP. É como um ingresso para uma festa: sem o documento certo, você simplesmente não entra.
\n\nNeste artigo, vamos explorar como gerenciar profissionalmente cabeçalhos em requisições HTTP GET em Go (Golang). Você aprenderá não apenas a sintaxe básica, mas também as armadilhas típicas que até desenvolvedores experientes enfrentam. Vamos lá!
\n\nPor que os cabeçalhos são importantes?
\n\nImagine que uma requisição HTTP é um envelope com uma carta. O envelope em si (corpo da requisição) pode estar vazio, mas as informações nele (cabeçalhos) decidem tudo:
\n- \n
- Content-Type — formato dos dados (JSON, XML, Form) \n
- Authorization — chave de acesso à API (Bearer token, Basic Auth) \n
- User-Agent — identificação do cliente (para não ser bloqueado como bot) \n
- Accept — qual formato de resposta você espera \n
Sem os cabeçalhos corretos, o servidor simplesmente não entenderá o que você quer.
\n\nMétodo 1: O velho http.Get (e por que ele não é adequado)
\n\nMuitos iniciantes em Go começam com http.Get(). É conveniente para testes, mas este método tem uma grande desvantagem — não é possível definir cabeçalhos.
package main\n\nimport (\n "fmt"\n "io/ioutil"\n "net/http"\n)\n\nfunc main() {\n // Assim não é possível adicionar cabeçalhos!\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 simplesmente envia uma requisição "nua". Se a API exigir um token de autenticação — você receberá 401 Unauthorized. Para projetos reais, essa abordagem não é adequada.
Método 2: Criando sua própria Request (o caminho correto)
\n\nEm Go, para ajustar requisições, usa-se o construtor http.NewRequest(). Ele retorna um objeto *http.Request, com o qual você pode fazer tudo, incluindo definir cabeçalhos.
Aqui está a estrutura básica:
\n\npackage main\n\nimport (\n "fmt"\n "io/ioutil"\n "net/http"\n)\n\nfunc main() {\n // 1. Criar a URL\n url := "https://api.github.com/users/golang"\n\n // 2. Criar uma nova requisição GET\n req, err := http.NewRequest("GET", url, nil)\n if err != nil {\n panic(err)\n }\n\n // 3. Definir os cabeçalhos\n req.Header.Set("User-Agent", "MyGoApp/1.0")\n req.Header.Set("Accept", "application/json")\n\n // 4. Enviar a requisição através do 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\nObserve que usamos req.Header.Set(), e não req.Header.Add(). A diferença é importante:
- \n
- Set — substitui o valor existente (se o cabeçalho já existir) \n
- Add — adiciona outro valor ao já existente (cria uma duplicata) \n
Para a maioria dos casos, use Set — é mais seguro.
Método 3: Trabalhando com autenticação (Bearer Token)
\n\nO cenário mais comum é a transmissão de um token JWT. Veja como fazer isso corretamente:
\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 // Definir o cabeçalho Authorization\n req.Heade