平时开发过程中,开发http请求工具类,甚至http压测模拟都是开发人员的家长便饭,go语言中,虽然已经为开发人员提供方便的http库,但在实际开发中,依然有很多冗余代码,在一些复杂请求中,也需要很多的开发量,此时你要这样想,你遇到的问题,大家也会遇到,这时找找工具类,或者一些库什么的,会起到事半功倍的作用,这不,笔者发现了一个http请求封装的库gout,小而巧,号称瑞士军刀。
https://github.com/guonaihong/gout
我们采用go原生的http发送一个get和一个post请求,来看go原生http需要编写那些代码,当需要cookie或者一些其他参数时代码将会下面的代码成倍增加,而且需要我们学习更多的原生api,成本也会增加
gout提供了非常方便链式api,封装了很多内部细节,对于研发人员常用的一些场景都做了非常不做的支持,而且还提供了debug,压测,追踪,重试,自定义等更多功能,下面带领大家一起体验下
一些简单的使用场景 ,Get,Post,Delete方法,如下代码,每种方法代表i中HTTP请求的methd, .do表示开始发送请求,至此一个HTTP请求就发送完毕
上面的代码问题很明显,怎么获取结果呢?错误了怎么办呢?,下面看一个GET的示例,声明一个result字符串变量,代表http返回的内容,通过BindBody把返回的结果绑定到result变量中,这个一个完整的请求就OK了,同时http请求结果的绑定还支持json,yam,xml,流等格式,主要方法就是BindJSON,BondXML,方法命名方式以此类推
我们了解了请求的发送,返回值的绑定,那么传参该怎么穿呢?支持哪些格式,一起来看看,我们支持GET请求直接在url后面拼接字符串就可以,Gout同时也支持设置参数方法
除了上面这些简单的查询,gout还支持回调处理,debug模式,trace跟踪,压测模拟等众多特性,一起看看这些特性,回调处理处理指的是针对http返回结果的不同code做出不同的处理结果,debug模式下会打印处理http发送请求时一些head信息,方便开发人员问题排查,trace跟踪会打印http请求各阶段的耗时,包括链接,处理,相应等,压测模拟指的是我们可以很方便的对一个http接口发起压测,同时统计压测结果。
下面截图告诉了我们QPS/s时810,失败的请求是52个,并发级别是20,持续压测时间10.01s,50%的请求都在20ms内完成,99%的请求都在73ms完成。
下面这些特性是gout官网的描述,感兴趣的同学可以再细细研究一下,看看源码实现,我相信这个库一定给你的开发效率和工具类带来很多方便,希望帮助到大家
1、支持设置 GET/PUT/DELETE/PATH/HEAD/OPTIONS
2、支持设置请求 http header(可传 struct,map,array,slice 等类型)
3、支持设置 URL query(可传 struct,map,array,slice,string 等类型)
4、支持设置 json 编码到请求 body 里面(可传struct, map, string, []byte 等类型)
5、支持设置 xml 编码到请求 body 里面(可传struct, string, []byte 等类型)
6、支持设置 yaml 编码到请求 body 里面(可传struct, map, string, []byte 等类型)
7、支持设置 form-data(可传 struct, map, array, slice 等类型)
8、支持设置 x-www-form-urlencoded(可传 struct,map,array,slice 等类型)
9、支持设置 io.Reader,uint/uint8/uint16...int/int8...string...[]byte...float32,float64 至请求 body 里面
10、支持解析响应body里面的json,xml,yaml至结构体里(BindJSON/BindXML/BindYAML)
11、支持解析响应body的内容至io.Writer, uint/uint8...int/int8...string...[]byte...float32,float64
12、支持解析响应header至结构体里
13、支持接口性能benchmark,可控制压测一定次数还是时间,可控制压测频率
14、支持retry-backoff,可以指定重试条件
15、支持发送裸http数据包
16、支持导出curl命令
17、传入自定义*http.Client
18、支持请求中间件(https://github.com/antlabs/gout-middleware)