fasthttp 听说是目前golang性能最好的http库,相对于自带的net/http,性能说是有10倍的提高,具体介绍能够看看官方介绍: valyala/fasthttphtml
正好最近须要用到,可是发现网上的资料也不是不少,特别是关于client模块的就更少了,只有一些翻译成中文的文档,因而乎就把关于client的代码研究了一下,总结了一些比较简单的使用方法,测试对比net/http是有必定程度的提高,若是须要用到http client彷佛fasthttp也是一个不错的选择,固然fasthttp也能够用来作http服务的,不过着并不在这次研究范围内。git
顺便也提下他的不足之处吧: 一个是他目前尚未支持http2, 一个是不支持WebSocket,可是WebSocket貌似已经有第三方库的支持了。github
fasthttp截至目前为止的todo list:golang
- SessionClient with referer and cookies support.
- ProxyHandler similar to FSHandler.
OK,言归正传,如何更高效得使用fasthttp来发起请求呢? emmmm... 好吧!表达能力比较通常,仍是直接上代码吧😂...shell
首先确定是须要安装fasthttp啦json
go get -u github.com/valyala/fasthttp 复制代码
以后就能够愉快得玩耍了。cookie
先来一波比较简单的,发起一个get请求:app
package main import ( "github.com/valyala/fasthttp" ) func main() { url := `http://httpbin.org/get` status, resp, err := fasthttp.Get(nil, url) if err != nil { fmt.Println("请求失败:", err.Error()) return } if status != fasthttp.StatusOK { fmt.Println("请求没有成功:", status) return } fmt.Println(string(resp)) } 复制代码
再来一个Post请求:post
func main() { url := `http://httpbin.org/post?key=123` // 填充表单,相似于net/url args := &fasthttp.Args{} args.Add("name", "test") args.Add("age", "18") status, resp, err := fasthttp.Post(nil, url, args) if err != nil { fmt.Println("请求失败:", err.Error()) return } if status != fasthttp.StatusOK { fmt.Println("请求没有成功:", status) return } fmt.Println(string(resp)) } 复制代码
上面两个简单的demo实现了get和post请求,这两个方法也已经实现了自动重定向,那么若是有更复杂的请求或须要手动重定向,须要怎么处理呢?好比有些API服务须要咱们提供json body或者xml body也就是,Content-Type是application/json、application/xml或者其余类型。继续看下面:性能
func main() { url := `http://httpbin.org/post?key=123` req := &fasthttp.Request{} req.SetRequestURI(url) requestBody := []byte(`{"request":"test"}`) req.SetBody(requestBody) // 默认是application/x-www-form-urlencoded req.Header.SetContentType("application/json") req.Header.SetMethod("POST") resp := &fasthttp.Response{} client := &fasthttp.Client{} if err := client.Do(req, resp);err != nil { fmt.Println("请求失败:", err.Error()) return } b := resp.Body() fmt.Println("result:\r\n", string(b)) } 复制代码
AcquireRequest()AcquireResponse()
func main() { url := `http://httpbin.org/post?key=123` req := fasthttp.AcquireRequest() resp := fasthttp.AcquireResponse() defer func(){ // 用完须要释放资源 fasthttp.ReleaseResponse(resp) fasthttp.ReleaseRequest(req) }() // 默认是application/x-www-form-urlencoded req.Header.SetContentType("application/json") req.Header.SetMethod("POST") req.SetRequestURI(url) requestBody := []byte(`{"request":"test"}`) req.SetBody(requestBody) if err := fasthttp.Do(req, resp); err != nil { fmt.Println("请求失败:", err.Error()) return } b := resp.Body() fmt.Println("result:\r\n", string(b)) } 复制代码
通过这样简单的改动,性能上确实是增长了一些。
关于fasthttp的文档,若是英文不太好的同窗能够考虑看看中文翻译版,地址:fasthttp中文文档