Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda boleh melog respons HTTP dalam `http.HandleFunc` Go menggunakan rantaian perisian tengah dan penggabung pengendali berfungsi?

Bagaimanakah anda boleh melog respons HTTP dalam `http.HandleFunc` Go menggunakan rantaian perisian tengah dan penggabung pengendali berfungsi?

Patricia Arquette
Patricia Arquetteasal
2024-10-28 04:41:30783semak imbas

How can you log HTTP responses in Go's `http.HandleFunc` using middleware chaining and functional handler combinators?

Melog Respons kepada Permintaan HTTP Masuk dalam http.HandleFunc

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.

Middleware Chaining

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.

Penggabung Pengendali Fungsian

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>

Mencipta Rangkaian Pengendali

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.

Melaksanakan Pengelogan Respons

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>

Menggunakan Pengendali Pengelogan Respons

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn