这个 Go 开源库让你能够更细致地掌握 HTTP 请求过程
2023-04-18 14:06:19 时间
大家好,我是欧盆索思(opensource),每天为你带来优秀的开源项目!
在日常开发中,通过 HTTP 请求其他服务是常有的事情。通常,我们只需要发出请求,获取响应并进行处理即可,处理过程被 http 库封装了。然而有没有办法更好地掌控请求的细节呢?今天推荐的这个 Go 语言库 mediary 就是干这个的。
项目地址:https://github.com/HereMobilityDevelopers/mediary,这个库是上个月刚开源的。
具体来说,这个库是将拦截器增加到 http.Client 上,能够更好地掌控其中的细节,具体来说可以做的事情包括:
- 转储(dump)请求和响应,输出到日志;
- 在发送之前更改请求,或者在返回之前更改响应;
- 使用 Opentracing/Jaeger 添加跟踪信息;
- 发送相关指标到统计监控系统;
注:拦截器这个概念最早来自 AOP(面向切面编程)。通俗来说,拦截器就是可以在目标动作的前后插入一些代码,执行一些其他的动作。
怎么使用呢?示例如下:
- var client *http.Client
- client = mediary.Init().AddInterceptors(your interceptor).Build()
- client.Get("https://golang.org")
看一个具体的 dump 拦截的例子:
- client := mediary.Init().AddInterceptors(dumpInterceptor).Build()
- client.Get("https://github.com")
- func dumpInterceptor(req *http.Request, handler mediary.Handler) (*http.Response, error) {
- if bytes, err := httputil.DumpRequestOut(req, true); err == nil {
- fmt.Printf("%s", bytes)
- // GET / HTTP/1.1
- // Host: github.com
- // User-Agent: Go-http-client/1.1
- // Accept-Encoding: gzip
- }
- return handler(req)
- }
同时加多个拦截器也是可以的:
- client := mediary.Init().
- AddInterceptors(First Interceptor, Second Interceptor).
- AddInterceptors(Third Interceptor).
- Build()
相关文章
- 微服务Docker打包
- 微服务网关Gateway实践总结
- Docker仓库管理镜像 -- 公共仓库【Docker Hub】和私人仓库【Registry】和【harbor】
- Spring框架中使用了哪些设计模式及应用场景
- 2022-8-30 servlet
- Get请求使用请求体传递参数会报400异常的问题
- 线程池中的一个 BUG,注意了!!
- 2022-8-29 javaweb 第一天 servlet/tomcat
- 如何使用(扫描)二维码进行登录
- Mac系统下Datagrip打不开、点击没反应?
- Java synchronized锁升级过程验证
- AOP面向切面编程简单介绍与应用
- Java---Stream入门
- 聊聊动态线程池的9个场景
- 历时2月,动态线程池 DynamicTp 发布里程碑版本 V1.0.8
- Docker也疯狂,微服务一键打包部署
- 面试手撕并发算法题
- 异步线程里的日志不好追踪?小支一招,轻松搞定!
- 字典服务的设计与管理
- 为何 JetBrains 公司做 IDE 就可以养活自己,而国内公司却很难做到?