Wie setze ich Header in einer HTTP-GET-Anfrage in Go? Vollständige Erklärung mit Code
\n\nHaben Sie jemals versucht, eine HTTP-GET-Anfrage an einen Server zu senden, und er gab einen Autorisierungsfehler zurück? Oder vielleicht ignorierte die API Ihre Anfrage, obwohl Sie genau wussten, dass sie funktionieren sollte? In 90 % der Fälle liegt das Problem in den HTTP-Headern. Sie sind wie eine Eintrittskarte für eine Party: Ohne das richtige Dokument werden Sie einfach nicht hereingelassen.
\n\nIn diesem Artikel werden wir untersuchen, wie Sie in Go (Golang) professionell mit Headern in HTTP-GET-Anfragen umgehen. Sie lernen nicht nur die grundlegende Syntax, sondern auch typische Fallstricke, in die selbst erfahrene Entwickler tappen. Los geht's!
\n\nWarum sind Header wichtig?
\n\nStellen Sie sich eine HTTP-Anfrage wie einen Umschlag mit einem Brief vor. Der Umschlag selbst (der Anfragetext) kann leer sein, aber die Informationen darauf (die Header) entscheiden über alles:
\n- \n
- Content-Type — das Datenformat (JSON, XML, Form) \n
- Authorization — der Zugriffsschlüssel für die API (Bearer Token, Basic Auth) \n
- User-Agent — die Identifikation des Clients (damit Sie nicht als Bot blockiert werden) \n
- Accept — welches Antwortformat Sie erwarten \n
Ohne die richtigen Header versteht der Server einfach nicht, was Sie von ihm wollen.
\n\nMethode 1: Der gute alte http.Get (und warum er ungeeignet ist)
\n\nViele Anfänger in Go beginnen mit http.Get(). Das ist praktisch für Tests, aber diese Methode hat einen großen Nachteil – Sie können keine Header setzen.
package main\n\nimport (\n "fmt"\n "io/ioutil"\n "net/http"\n)\n\nfunc main() {\n // So können Sie keine Header hinzufügen!\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\nDieser Code sendet einfach eine „nackte" Anfrage. Wenn die API einen Autorisierungstoken erfordert, erhalten Sie 401 Unauthorized. Für reale Projekte ist dieser Ansatz ungeeignet.
Methode 2: Eigene Request erstellen (der richtige Weg)
\n\nIn Go wird für die Feineinstellung von Anfragen der Konstruktor http.NewRequest() verwendet. Er gibt ein Objekt *http.Request zurück, mit dem Sie alles machen können, einschließlich dem Setzen von Headern.
Hier ist die grundlegende Struktur:
\n\npackage main\n\nimport (\n "fmt"\n "io/ioutil"\n "net/http"\n)\n\nfunc main() {\n // 1. URL erstellen\n url := "https://api.github.com/users/golang"\n\n // 2. Neue GET-Anfrage erstellen\n req, err := http.NewRequest("GET", url, nil)\n if err != nil {\n panic(err)\n }\n\n // 3. Header setzen\n req.Header.Set("User-Agent", "MyGoApp/1.0")\n req.Header.Set("Accept", "application/json")\n\n // 4. Anfrage über HTTP-Client senden\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\nBeachten Sie: Wir verwenden req.Header.Set(), nicht req.Header.Add(). Der Unterschied ist wichtig:
- \n
- Set — ersetzt den vorhandenen Wert (falls dieser Header bereits existiert) \n
- Add — fügt einen weiteren Wert zum vorhandenen hinzu (erstellt ein Duplikat) \n
Für die meisten Fälle verwenden Sie Set – das ist sicherer.
Methode 3: Arbeiten mit Autorisierung (Bearer Token)
\n\nDas häufigste Szenario ist die Übergabe eines JWT-Tokens. So machen Sie es richtig:
\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 // Authorization-Header setzen\n req.Heade