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

Patricia Arquette
Lepaskan: 2024-10-28 04:41:30
asal
782 orang telah melayarinya

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>
Salin selepas log masuk

Mencipta Rangkaian Pengendali

Kami boleh merantai berbilang pengendali bersama menggunakan penggabung:

<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Dengan cara ini, apabila kita memulakan rantaian seperti:

<code class="go">h := NewDefaultHandler(...)</code>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!