httpclient

package module
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 14, 2022 License: MulanPSL-2.0 Imports: 7 Imported by: 0

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.Parsehttp.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>"},
		}),
	)

看出来有点不同了吧。这个方法和标准库中的 NewRequesthttp.NewRequestWithContext 有些不一样。

  1. 传 body 的时候统一改成了使用 []byte,这样组装 Request 时可以更方便快速地给 ContentLengthGetBody 字段赋值。而且也方便了调用者,大家传 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" 就可以了。

Documentation

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL