Heim > Backend-Entwicklung > Golang > Warum erhalte ich auf meinem Go-HTTP-Server den Fehler „http: multiple Response.WriteHeader-Aufrufe'?

Warum erhalte ich auf meinem Go-HTTP-Server den Fehler „http: multiple Response.WriteHeader-Aufrufe'?

DDD
Freigeben: 2024-12-17 13:24:11
Original
671 Leute haben es durchsucht

Why am I getting the

Mehrere WriteHeader-Aufrufe in einem einfachen HTTP-Server

Ein einfacher HTTP-Server, der in Go mithilfe des Pakets net/http implementiert wurde, zeigt ungewöhnliches Verhalten, da angezeigt durch die Fehlermeldung:

http: multiple response.WriteHeader calls
Nach dem Login kopieren

Dieser Fehler deutet darauf hin, dass der Server versucht, den Antwortheader mehrmals zu schreiben, was nicht zulässig ist durch die HTTP-Spezifikation. Analysieren wir den Code, um zu verstehen, warum dieses Problem auftritt:

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Println(r.URL)
        go HandleIndex(w, r)
    })

    fmt.Println("Starting Server...")
    log.Fatal(http.ListenAndServe(":5678", nil))
}

func HandleIndex(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(200)
    w.Write([]byte("Hello, World!"))
}
Nach dem Login kopieren

Analyse

Das Hauptproblem liegt in der anonymen Funktion, die als Handler für eingehende Anfragen registriert ist:

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    go HandleIndex(w, r)
}
Nach dem Login kopieren

Diese Funktion gibt die Anforderungs-URL aus und startet eine neue Goroutine zum Aufrufen von HandleIndex(). Anschließend wird die Ausführung normal fortgesetzt.

Wenn die Handlerfunktion den Antwortstatus nicht festlegt oder nichts in die Antwort schreibt, setzt Go den Status automatisch auf 200 (HTTP OK) und kehrt zurück. Dieses Verhalten gilt für die anonyme Funktion in unserem Code, die den Antwortstatus nicht explizit festlegt oder vor der Zeile „go HandleIndex(w, r)“ darauf schreibt.

Wenn HandleIndex() in einer separaten Funktion aufgerufen wird goroutine, die anonyme Funktion setzt ihre Ausführung fort und endet mit der Bearbeitung der Anfrage. Da der Antwortstatus nicht zuvor festgelegt wurde, setzt Go ihn automatisch auf 200 HTTP OK. Die erzeugte Goroutine versucht jedoch auch, den Antwortstatus innerhalb von HandleIndex() festzulegen, was zum Fehler „mehrere Response.WriteHeader-Aufrufe“ führt.

Lösung

An Um dieses Problem zu vermeiden, entfernen Sie entweder das Schlüsselwort „go“ aus der Zeile, die die Goroutine startet:

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    HandleIndex(w, r)
}
Nach dem Login kopieren

oder stellen Sie sicher, dass die anonyme Funktion die Antwort festlegt Status und schreibt darauf, bevor es zurückkehrt:

func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL)
    w.Write([]byte("Hello, World!"))
    go HandleIndex(w, r)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum erhalte ich auf meinem Go-HTTP-Server den Fehler „http: multiple Response.WriteHeader-Aufrufe'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage