下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

IT业界:这个 Go 开源库让你能够更细致地掌握 HTTP 请求过程

作者:课课家教育     来源: 今日头条点击数:820发布时间: 2020-04-28 23:52:06

标签: IT业界编程语言互联网

软考,您想通过吗?一次通过才是硬道理

Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点:

它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。Go完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持。按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。

大家好,我是欧盆索思(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()

 

Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。