我想知道在使用ListenAndServe时是否有记录响应的方法。
据我所知,句柄没有访问“Response”对象的权限。只有一个ResponseWriter,因此我无法调用httputil.DumpResponse。
我想知道在使用ListenAndServe时是否有记录响应的方法。
据我所知,句柄没有访问“Response”对象的权限。只有一个ResponseWriter,因此我无法调用httputil.DumpResponse。
http.ResponseWriter是一个接口。您可以使用嵌入来扩展它进行记录,如下所示。
package main
import (
"log"
"net/http"
)
func sampleHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
response := []byte("Sample Response")
w.Write(response)
}
type loggingResponseWriter struct {
status int
body string
http.ResponseWriter
}
func (w *loggingResponseWriter) WriteHeader(code int) {
w.status = code
w.ResponseWriter.WriteHeader(code)
}
func (w *loggingResponseWriter) Write(body []byte) (int, error) {
w.body = string(body)
return w.ResponseWriter.Write(body)
}
func responseLogger(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
loggingRW := &loggingResponseWriter{
ResponseWriter: w,
}
h.ServeHTTP(loggingRW, r)
log.Println("Status : ", loggingRW.status, "Response : ", loggingRW.body)
})
}
func main() {
http.Handle("/", responseLogger(http.HandlerFunc(sampleHandler)))
http.ListenAndServe(":8080", nil)
}
您可以使用responseLogger对希望记录响应的处理程序函数进行封装。
ResponseWriter
之前并不存在。
但在response
中只有header
、body
和response code
,所以在处理函数中,你可以使用ResponseWriter
上的Header()
方法获取头信息,然后你可以在将其写入ResponseWriter
之前记录response code
和body
。
如果你提供一个你想要做的例子,我可以详细说明如何实现。
这是我为一个小项目修复此问题的方法:
我在所有处理函数中都使用了这种方式:
type transaction struct {
res Response // Create this type also
req Request // Create this type also
}
func NewTransaction(w http.ResponseWriter, req *http.Request) *transaction{}
Log := make(chan transaction, 100)
go func{
// Read from channel and log the info however you want.
}()
func indexHandler(w http.ResponseWriter, req *http.Request) {
tx := NewTransaction(w, req) // Struct with the request and response
defer func() {
Log <- tx
}()
/*
Handle request here
*/
// Update request and response
Request.Body = body
}
fasthttp
编写HTTP处理程序以记录响应。 - Sankar