发起请求
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)