Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah anda boleh melog respons HTTP dalam `http.HandleFunc` Go menggunakan rantaian perisian tengah dan penggabung pengendali berfungsi?
Dalam artikel sebelumnya bertajuk "In go, how to inspect the HTTP jawapan yang ditulis kepada http.ResponseWriter?" kami meneroka kaedah untuk memeriksa respons pelayan dalam persekitaran ujian unit. Walau bagaimanapun, pendekatan ini mungkin tidak sesuai untuk pelayan langsung.
Penyelesaian alternatif ialah middleware chaining, teknik yang biasa digunakan untuk mengubah suai dan mengelog HTTP respons dan permintaan sambil mengekalkan aliran permintaan-tindak balas asal.
Daripada menggunakan perpustakaan seperti negroni, kami boleh mencipta pengendali berfungsi kami sendiri penggabung:
<code class="go">func NewFooHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // do something before next(w, r) // do something after } }</code>
Kami boleh merantai berbilang pengendali bersama menggunakan penggabung:
<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
Dalam contoh ini, Sink ialah pengendali kosong yang tidak melakukan apa-apa.
Menggunakan pendekatan penggabung pengendali, kita boleh mencipta pengendali yang merekodkan respons :
<code class="go">func NewResponseLoggingHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // Replace the response writer with a recorder c := httptest.NewRecorder() next(c, r) // Copy the response from the recorder to the actual writer for k, v := range c.HeaderMap { w.Header()[k] = v } w.WriteHeader(c.Code) c.Body.WriteTo(w) } }</code>
Kami boleh menggunakan pengendali pengelogan respons kepada semua laluan HTTP dengan mencipta penggabung pengendali lalai:
<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc { return NewResponseLoggingHandler(NewOtherStuffHandler(next)) }</code>
Dengan cara ini, apabila kita memulakan rantaian seperti:
<code class="go">h := NewDefaultHandler(...)</code>
Ia akan menyertakan pengelogan respons dan mana-mana pengendali lalai yang lain secara automatik.
Atas ialah kandungan terperinci Bagaimanakah anda boleh melog respons HTTP dalam `http.HandleFunc` Go menggunakan rantaian perisian tengah dan penggabung pengendali berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!