🌍

HTTP 请求

发起请求

import "github.com/sohaha/zlsgo/zhttp" data, err := zhttp.Get(url, param...) // data, err := zhttp.Post(url, param...) // data, err := zhttp.Put(url, param...) // ... // data, err := zhttp.Do("Get", url, param...) // 获取结果 res := data.String() // 获取 HTML 解析 res := data.HTML()
 

传递参数

// 发送 Get 数据 data := zhttp.QueryParam{ "say":"hi", } data, err := zhttp.Get(url, data) // 发送 Post 数据 data := zhttp.Param{ "say":"hi", } data, err := zhttp.Post(url, data) // 设置 Header header := zhttp.Header{ "X-TOKEN":"666", } data, err := zhttp.Get(url, data, header) // 发送 JSON json := `{"name":"hi"}` // json 字符串 // json := &j{"name":"hi"} // 结构体 // 使用 BodyJSON 包裹可以无需手动设置 Content-Type data, err := zhttp.Post(url, zhttp.BodyJSON(json)) // 其他 zhttp.Get(url, []byte, string, bytes.Buffer...)

获取结果集

data, err := zhttp.Get(url) // 获取结果 res := data.String() // 获取 HTML 解析 res := data.HTML() // 获取 zjson 对象 res := data.JSONs() // 获取 json 某值 value := data.JSON(key).String()

设置 Header

header := zhttp.Header{"Content-Type": "application/json"} data, err := zhttp.Post(url, header)

文件上传/下载

// 默认情况 请求超时是 10 分钟,如果上传/下载文件过大建议延长超时时间 zhttp.SetTimeout(time.Hour * 2) // 上传示例 file := zhttp.File("file.png") // 要上传的文件 fileOthe := zhttp.File("file*.png","字段名,默认:media") zhttp.Post(url, file, fileOthe, zhttp.UploadProgress(func(current, total int64) { fmt.Println(float32(current)/float32(total)*100, "%") // 上传进度 })) // 关闭分块处理,关闭后无法获取上传进度 // 默认情况上传会使用分块但是对于服务端不支持的时候可以关闭,比如微信接口 zhttp.DisableChunke() // 下载示例 res, _ := zhttp.Get(url, zhttp.DownloadProgress(func(current, total int64) { fmt.Println(float32(current)/float32(total)*100, "%") // 下载进度 })) // 保存文件 res.ToFile("file.png")
 

请求超时

zhttp.SetTimeout(60 * time.Second) // 也可以直接使用 context ctx, cancel := context.WithTimeout(context.Background(), 60 * time.Second) defer cancel() zhttp.Get(url, ctx)
 

SSE 流请求

sse := zhttp.SSE("http://127.0.0.1:3788/sse") go func() { time.Sleep(time.Second * 15) // Manual close sse.Close() }() sseFor: for { select { case <-sse.Done(): break sseFor case ev := <-sse.Event(): fmt.Printf("id:%s msg:%s [%s]\n", ev.ID, string(ev.Data), ev.Event) } }

设置 UserAgent

zhttp.SetUserAgent(func() string { // 返回空表示从内置 UA 列表(zhttp.UserAgentLists)随机一个 return "" })

设置代理

// http 代理 zhttp.SetProxyUrl("http://proxy.com","http://proxy2.com") zhttp.SetProxy(func(r *http.Request) (*url.URL, error) { return url.Parse("http://proxy.com") }) // 移除已设置的代理 zhttp.RemoveProxy() // 如需使用 SOCKS5 代理 // import "golang.org/x/net/proxy" proxyAddr := fmt.Sprintf("%s:%d", "代理IP", 端口) auth := &proxy.Auth{ User: "用户名", Password: "密码", } dialSocksProxy, err := proxy.SOCKS5("tcp", proxyAddr, auth, proxy.Direct) if err != nil { zlog.Fatal(err) } _ = h.SetTransport(func(transport *http.Transport) { // transport.MaxIdleConnsPerHost = 100 // 跳过 https 证书验证 // transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} transport.DialContext = func(ctx context.Context, network, addr string) (conn net.Conn, e error) { return dialSocksProxy.Dial(network, addr) } })
 

配置证书

zhttp.TlsCertificate(zhttp.Certificate{ CertFile: crt, KeyFile: key, })
 

Cookie

// 禁止自动管理 zhttp.EnableCookie(false) // 主动获取 data, err := zhttp.Get(url, param...) data.GetCookie() // 手动发送 cookie := new(http.Cookie) zhttp.Get(url, cookie)
 

重定向处理

http := zhttp.New() http.CheckRedirect(fn ...func(req *http.Request, via []*http.Request) error) // 如需禁止重定向直接留空即可 http.CheckRedirect() // 单个请求禁止重定向 zhttp.Get(url, zhttp.NoRedirect(true))
 

请求重试

// 如果请求的链接存在不稳定性,可以使用请求重试功能 // 最多尝试重试 10 次,失败后等待一秒再重试 data, err := zhttp.DoRetry(10, time.Second*1 , func() (*Res, error) { // 一般情况 return zhttp.Get(url) // 也可以自己控制什么情况算是失败 data, err := zhttp.Get(url) // 比如返回的状态码不是200就等于失败 if data.StatusCode() != 200{ return errors.New("状态码不是 200") } return data, err })
 

配置 http.Client

// 方式一,直接修改当前的 Client client := zhttp.Client() // 比如设置超时时间也可以这样设置 client.Timeout = time.Hour // 方式二,传递新的 Client client := &http.Client{} zhttp.Get(url, client)