Client 与 Transport 中间件已支持,解锁更多实用玩法
Posted August 15, 2022 by roc ‐ 1 min read
新增 Client 与 Transport 中间件能力
req 当前已支持 Client 和 Transport 中间件,您可以更新 req 到最新版:
go get -u github.com/imroc/req/v3
用法速览
Client 中间件:
client := req.C()
client.WrapRoundTripFunc(func(rt req.RoundTripper) req.RoundTripFunc {
return func(req *req.Request) (resp *req.Response, err error) {
// before request
// ...
resp, err = rt.RoundTrip(req)
// after response
// ...
return
}
})
Transport 中间件:
transport := req.C().GetTransport()
transport.WrapRoundTripFunc(func(rt http.RoundTripper) req.HttpRoundTripFunc {
return func(req *http.Request) (resp *http.Response, err error) {
// before request
// ...
resp, err = rt.RoundTrip(req)
// after response
// ...
return
}
})
适用场景
Client 与 Transport 中间件可以拦截所有请求与响应,在请求前和响应后都可以分别加入任何需要的逻辑,比如可以统一为所有 HTTP 请求记录 log、metrics、trace 等数据,或者统一处理异常。
特别是在 trace 场景,在进行链路追踪时,逻辑往往需要同时覆盖请求前与响应后,用 RequestMiddleware
或 ResponseMiddleware
是不合适的,这时候就可以选择用 Client 或 Transport 中间件。
Client 与 Transport 中间件的区别是,在 Client 中间件中可以访问 *req.Request
与 *req.Response
,在 Transport 中间件中只能访问到 *http.Request
与 *http.Response
,后者是前者的子集,所以 Client 中间件功能更强大。
什么情况下用 Transport 中间件?一般是与其它库或存量项目进行集成时用,使用 *req.Transport
替换掉 http.Client
的 Transport
,用最少的代码改动,统一为所有 http 请求记录 log、metrics、trace 等数据,或者统一处理异常。