HTTP Client
HTTP Client 对 go 标准库的 net/http
做了一层薄的封装。主要改动如下:
- 增加一个 client pool,在不适合使用默认 Client 的时候,可以用
pool.Get
方法代替原来的 &http.Client{}
,以减少内存分配。
- 增加一个
http.Request
的初始化方法 NewRequest
。
在增加这些新功能的同时,我们尽量避免了使用结构体套原结构体的方法,你也可以认为这些功能是一个 net/http
库的 helper functions。
V0.1.2 新增功能
添加 headerparser 子包,可以直接调用 headerparser.Parse
将 http.Header
解析到结构体中。
Usage
import (
"context"
"net/url"
"testing"
"gitee.com/FlyingOnion/httpclient"
)
func main() {
c := httpclient.New()
ctx, cancel := context.WithCancel(context.Background())
u, _ := url.Parse("https://gitee.com")
req := httpclient.NewRequest(ctx, u)
resp, err := c.Do(req)
// Do something with resp
cancel()
// Do not forget to recycle. It's still usable.
httpclient.Recycle(c)
}
好像和原来没什么区别??
http.Client
初始化部分只是池化了,跟原来没什么区别。我们主要改动的是 http.Request
的初始化方法。来看下面这个。
u, _ := url.Parse("https://gitee.com")
b, _ := json.Marshal()
req := httpclient.NewRequest(ctx, u,
httpclient.Method("POST"),
httpclient.Body(b),
httpclient.Header(http.Header{
"Auth": []string{"<auth-token>"},
}),
)
看出来有点不同了吧。这个方法和标准库中的 NewRequest
和 http.NewRequestWithContext
有些不一样。
- 传 body 的时候统一改成了使用
[]byte
,这样组装 Request
时可以更方便快速地给 ContentLength
和 GetBody
字段赋值。而且也方便了调用者,大家传 json
可以不用再手动包一层 bytes.Reader
。
Header
不用跟原来一样,New
的时候初始化一次,赋值的时候再重新搞一次。
- 参数中的 url 需要调用者手动组装,或者用
url.Parse
。原来的方法是传一个 string
,但有时如果 url 的 query 列表比较复杂时,则需要调用者先初始化 *url.URL
,填入参数到 RawQuery
字段,然后执行 u.Encode
方法转换成字符串,最后由库将字符串再转换回 *url.URL
。太麻烦了。大家应该都对 go 很熟了,一个 *url.URL
难不倒大家的😄。
HTTPS 怎么搞??
使用 httpclient.NewClientWithTransport
初始化 client。可以传入 http.Transport
,在那里传入 *TLSConfig
。URL 的 scheme 改为 "https"
就可以了。