相关疑难解决方法(0)

Golang读取请求正文

我正在编写自己的logginMiddleware.基本上,我需要记录请求的主体和响应.我遇到的问题是,当我读到身体时,它会变空,我无法读取它两次.我知道它发生是因为它是ReadCloser类型.有没有办法将身体倒回到开头?

http go server

46
推荐指数
1
解决办法
7万
查看次数

Go gorilla 记录每个请求的持续时间和状态代码

我有一个使用 gorilla/mux v1.7.3 和 gorilla/context v1.1.1 在 Go1.13 中编写的 REST API。

我想记录每个请求的持续时间和状态代码。我已经有了一个基本的工作版本,但我想知道是否有一个更干净的选项。

我有大约 20 个 HTTP 调用。我们以其中一个为例:

client.HandleFunc("/register", register.Handle).Methods("POST") 
Run Code Online (Sandbox Code Playgroud)

的签名register.Handle是:

func Handle(w http.ResponseWriter, r *http.Request) { ... }
Run Code Online (Sandbox Code Playgroud)

因此,为了记录每个请求持续时间和状态代码,我简单地register.Handle用“日志处理程序”包装方法处理程序:

client.HandleFunc("/register", log.HandleRequestWithLog(register.Handle)).Methods("POST")
Run Code Online (Sandbox Code Playgroud)

log.HandleRequestWithLog只是对函数执行进行计时,并使用返回的状态代码进行记录(使用 Azure 指标进行记录):

func HandleRequestWithLog(h func(http.ResponseWriter, *http.Request) int) http.HandlerFunc {
    return func(writer http.ResponseWriter, request *http.Request) {
        startTime := time.Now()
        statusCode := h(writer, request)
        duration := time.Now().Sub(startTime)
        trace := appinsights.NewRequestTelemetry(request.Method, request.URL.Path, duration, string(rune(statusCode)))
        trace.Timestamp = time.Now()
        client.Track(trace)
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,为了提取状态代码,我需要每个 HTTP 方法都返回状态代码。所以我将签名更改为:

func Handle(w …
Run Code Online (Sandbox Code Playgroud)

rest logging go gorilla

2
推荐指数
1
解决办法
3503
查看次数

标签 统计

go ×2

gorilla ×1

http ×1

logging ×1

rest ×1

server ×1