Heim > Backend-Entwicklung > Golang > Wie überschreibe ich HTTP-Header in der Go-Middleware ohne Duplizierung?

Wie überschreibe ich HTTP-Header in der Go-Middleware ohne Duplizierung?

Barbara Streisand
Freigeben: 2024-12-03 16:29:11
Original
494 Leute haben es durchsucht

How to Override HTTP Headers in Go Middleware Without Duplication?

Überschreiben von HTTP-Headern von externer Go-Middleware

Hintergrund

Middleware in Go ist es gewohnt Anfragen und Antworten abfangen und ändern, bevor sie den Handler erreichen. Wenn jedoch mehrere Middleware-Komponenten denselben Header ändern, kann dies dazu führen, dass mehrere Instanzen dieses Headers in der Antwort festgelegt werden.

Betrachten Sie die folgende Beispiel-Middleware:

func Server(h http.Handler, serverName string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Server", serverName)
        h.ServeHTTP(w, r)
    })
}
Nach dem Login kopieren

Wenn diese Middleware Wird zusammen mit anderer Middleware verwendet, die den „Server“-Header festlegt, führt dies zu mehreren „Server“-Headern in der Antwort.

Benutzerdefiniert ResponseWriter

Um dieses Problem zu beheben, können wir einen benutzerdefinierten ResponseWriter erstellen, der den WriteHeader()-Aufruf abfängt und den entsprechenden Header festlegt, bevor die Anfrage weitergegeben wird.

type serverWriter struct {
    w           http.ResponseWriter
    name        string
    wroteHeader bool
}

func (s serverWriter) WriteHeader(code int) {
    if s.wroteHeader == false {
        s.w.Header().Set("Server", s.name)
        s.wroteHeader = true
    }
    s.w.WriteHeader(code)
}

func (s serverWriter) Write(b []byte) (int, error) {
    return s.w.Write(b)
}

func (s serverWriter) Header() http.Header {
    return s.w.Header()
}
Nach dem Login kopieren

Durch die Verwendung Mit diesem benutzerdefinierten ResponseWriter in unserer Server-Middleware können wir sicherstellen, dass der „Server“-Header nur einmal festgelegt wird.

func Server(h http.Handler, serverName string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        sw := serverWriter{
            w:           w,
            name:        serverName,
            wroteHeader: false,
        }
        h.ServeHTTP(sw, r)
    })
}
Nach dem Login kopieren

Dies Die Lösung ermöglicht es uns, die HTTP-Header von der äußeren Middleware aus zu steuern, ohne die Semantik von ServeHTTP zu verletzen.

Das obige ist der detaillierte Inhalt vonWie überschreibe ich HTTP-Header in der Go-Middleware ohne Duplizierung?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage