In the previous article titled "In go, how to inspect the HTTP response that is written to http.ResponseWriter?" we explored a method for inspecting server responses in a unit testing environment. However, this approach may not be suitable for live servers.
An alternative solution is middleware chaining, a commonly used technique for modifying and logging HTTP responses and requests while preserving the original request-response flow.
Instead of using a library like negroni, we can create our own functional handler combinators:
<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>
We can chain multiple handlers together using the combinators:
<code class="go">h := NewFooHandler(NewBarHandler(NewBazHandler(Sink)))</code>
In this example, Sink is an empty handler that does nothing.
Using the handler combinator approach, we can create a handler that logs the response:
<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>
We can apply the response logging handler to all HTTP routes by creating a default handler combinator:
<code class="go">func NewDefaultHandler(next http.HandlerFunc) http.HandlerFunc { return NewResponseLoggingHandler(NewOtherStuffHandler(next)) }</code>
This way, whenever we start a chain like:
<code class="go">h := NewDefaultHandler(...)</code>
It will automatically include response logging and any other default handlers.
The above is the detailed content of How can you log HTTP responses in Go's `http.HandleFunc` using middleware chaining and functional handler combinators?. For more information, please follow other related articles on the PHP Chinese website!