Heim > Backend-Entwicklung > Golang > Wie ändere ich den Antwortcode einer HTTP-Anfrage mithilfe von Middleware?

Wie ändere ich den Antwortcode einer HTTP-Anfrage mithilfe von Middleware?

WBOY
Freigeben: 2024-02-08 21:00:04
nach vorne
580 Leute haben es durchsucht

Wie ändere ich den Antwortcode einer HTTP-Anfrage mithilfe von Middleware?

Frageninhalt

Ich versuche, mit Go-Chi ein API-Gateway zu entwickeln. Ich möchte den Statuscode auf 200 setzen, wenn die Anfrage „_always200=true“ in der Abfrage enthält. Folgendes habe ich versucht: custom_response_writer.go:

type CustomResponseWriter struct {
    http.ResponseWriter
    Buf         *bytes.Buffer
    StatusCode  int
    WroteHeader bool
}

func NewCustomResponseWriter(w http.ResponseWriter) *CustomResponseWriter {
    return &CustomResponseWriter{ResponseWriter: w, Buf: new(bytes.Buffer)}
}

func (c *CustomResponseWriter) WriteHeader(code int) {
    c.StatusCode = code
    c.ResponseWriter.WriteHeader(code)
}

func (c *CustomResponseWriter) Write(b []byte) (int, error) {
    return c.Buf.Write(b)
}
Nach dem Login kopieren

Middleware:

func HeaderFilterMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        always200, _ := r.Context().Value(always200QueryKey).(bool)
        crw := NewCustomResponseWriter(w)
        next.ServeHTTP(crw, r)

        if always200 {
            crw.WriteHeader(http.StatusOK)
        }
    })
}
Nach dem Login kopieren

Gibt immer 404 zurück. Gibt es eine Möglichkeit, dieses Problem zu lösen?


Richtige Antwort


Es gibt mindestens zwei Probleme im Code.

  1. always200, _ := r.Context().Value(always200QueryKey).(bool) 不是获取查询参数的正确方法。我认为您应该使用 r.URL.Query().Get("_always200") 来读取它,并将该值与字符串 "true" Vergleichen.

  2. Bis next.ServeHTTP(crw, r) 之后调用 crw.WriteHeader(http.StatusOK) ist es zu spät. Als ich den Code getestet habe, wurde diese Warnmeldung ausgegeben:

    http: superfluous response.WriteHeader call from main.(*CustomResponseWriter).WriteHeader
    Nach dem Login kopieren

Hier ist ein modifiziertes Beispiel zum Ändern des Antwortstatuscodes:

<code>package main

import (
    "bytes"
    "net/http"
    "strings"

    "github.com/go-chi/chi/v5"
)

type CustomResponseWriter struct {
    http.ResponseWriter
    Buf                *bytes.Buffer
    OriginalStatusCode int
    WroteHeader        bool
    always200          bool
}

func NewCustomResponseWriter(w http.ResponseWriter, always200 bool) *CustomResponseWriter {
    return &CustomResponseWriter{
        ResponseWriter: w,
        Buf:            new(bytes.Buffer),
        always200:      always200,
    }
}

func (c *CustomResponseWriter) WriteHeader(code int) {
    c.OriginalStatusCode = code

    if c.always200 {
        code = http.StatusOK
    }
    c.ResponseWriter.WriteHeader(code)
}

func (c *CustomResponseWriter) Write(b []byte) (int, error) {
    return c.Buf.Write(b)
}

func HeaderFilterMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        always200 := r.URL.Query().Get("_always200")
        crw := NewCustomResponseWriter(w, strings.EqualFold(always200, "true"))
        next.ServeHTTP(crw, r)
    })
}

func main() {
    r := chi.NewRouter()

    r.Use(HeaderFilterMiddleware)

    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("welcome"))
    })
    http.ListenAndServe(":3000", r)
}
</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie ändere ich den Antwortcode einer HTTP-Anfrage mithilfe von Middleware?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
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