Saya cuba membangunkan get laluan api menggunakan go-chi. Saya mahu menetapkan kod status kepada 200 jika permintaan mengandungi "_always200=true" dalam pertanyaan. Inilah yang saya telah cuba: 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) }
Perisian tengah:
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) } }) }
Sentiasa mengembalikan 404. Adakah terdapat cara untuk menyelesaikan masalah ini?
Terdapat sekurang-kurangnya dua masalah dalam kod.
always200, _ := r.Context().Value(always200QueryKey).(bool)
不是获取查询参数的正确方法。我认为您应该使用 r.URL.Query().Get("_always200")
来读取它,并将该值与字符串 "true"
Bandingkan.
Oleh next.ServeHTTP(crw, r)
之后调用 crw.WriteHeader(http.StatusOK)
sudah terlambat. Apabila saya menguji kod itu, ia mencetak mesej amaran ini:
http: superfluous response.WriteHeader call from main.(*CustomResponseWriter).WriteHeader
Berikut ialah contoh yang diubah suai untuk menukar kod status respons:
<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>
Atas ialah kandungan terperinci Bagaimana untuk menukar kod respons permintaan http menggunakan middleware?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!