# httpclient **Repository Path**: FlyingOnion/httpclient ## Basic Information - **Project Name**: httpclient - **Description**: HTTPClient 对 go 标准库的 net/http 做了一层薄的封装。 - **Primary Language**: Go - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-11 - **Last Updated**: 2024-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: Go语言, HttpClient ## README # 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 ```go 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` 的初始化方法。来看下面这个。 ```go 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{""}, }), ) ``` 看出来有点不同了吧。这个方法和标准库中的 `NewRequest` 和 `http.NewRequestWithContext` 有些不一样。 1. 传 body 的时候统一改成了使用 `[]byte`,这样组装 `Request` 时可以更方便快速地给 `ContentLength` 和 `GetBody` 字段赋值。而且也方便了调用者,大家传 `json` 可以不用再手动包一层 `bytes.Reader`。 2. `Header` 不用跟原来一样,`New` 的时候初始化一次,赋值的时候再重新搞一次。 3. 参数中的 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"` 就可以了。