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
WBOYnach vorne
2024-02-08 21:00:04609Durchsuche

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)
}

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)
        }
    })
}

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

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>

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Rennbedingungen laufenNächster Artikel:Rennbedingungen laufen