http - 通过 HTTP 客户端记录所有 HTTP 请求和响应
问题描述
我有以下简单的http.Client
:
import (
"net/http"
"log"
)
...
func main() {
...
link = "http://example.com"
method = "GET"
req, _ := http.NewRequest(method, link, nil)
client := &http.Client{}
myZapLogger.Info("Sending a %s request to %s\n", method, link)
resp, err := client.Do(req)
if err != nil {
myZapLogger.Error(..., err) // I'm logging rather than fatal-ing or so
} else {
myZapLogger.Info("Received a %d on request X", resp.StatusCode)
}
...
}
...
我正在寻找一种通过钩子(或左右)为每个请求执行上述操作的方法,以便每次都会自动触发它。我可以编写一个包含所有内容的函数,但是在我将 http 客户端传递给其他包的情况下,我将无法以这种方式控制/记录此类请求(例如aws-go-sdk
)。
有没有办法通过上下文或将钩子附加到客户端来做到这一点?
谢谢
解决方案
eudore的评论回答了这个问题;我将其放入代码中:
type MyRoundTripper struct {}
func (t MyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
// Do work before the request is sent
resp, err := http.DefaultTransport.RoundTrip(req)
if err != nil {
return resp, err
}
// Do work after the response is received
return resp, err
}
要使用它,您只需将它传递给您的 HTTP 客户端:
rt := MyRoundTripper{}
client := http.Client{Transport: rt}
推荐阅读
- reactjs - react元素本身是否有内部文本,内部html?
- c# - 如何在 Visual Studio 中为 LSP 启用诊断跟踪
- ios - 我们可以让 UIView 的高度总是随着里面的 UIStackView 的高度调整大小吗?
- flutter - 如何在颤动中返回上一页
- logging - 榛子线装饰
- c# - 值不能为空。参数名称:过滤器。如何找到这个参数?
- python - 在python中的另一个字典中出现一个字典的元素的计数器
- scala - 使用模式匹配动态返回案例类的实例
- r - 如何只保留列中的前 n 行
- python - 通过 Heroku 上的节点端点运行 Python 脚本时未找到模块解耦