sreq
一个简单,易用和并发安全的Golang网络请求库,‘s’ 意指简单。
功能
- 简便地发送GET/HEAD/POST/PUT/PATCH/DELETE/OPTIONS等HTTP请求。
- 简便地设置参数,请求头,或者Cookies。
- 简便地发送Form表单, JSON 数据,或者上传文件。
- 简便地设置 Basic 认证,Bearer令牌。
- 自动管理Cookies。
- 自定义HTTP客户端。
- 简便地设置请求上下文。
- 简便地对响应解码,输出字节码,字符串,或者对JSON反序列化。
- 并发安全。
安装
go get -u github.com/winterssy/sreq
使用
import "github.com/winterssy/sreq"
例子
sreq 发送请求跟基础库 net/http 非常像,你可以无缝切换。举个栗子,如果你之前的请求是这样的:
resp, err := http.Get("")
使用 sreq 你只须这样:
resp, err := sreq.Get("").Resolve()
更多的示例:
- 设置参数
- 设置请求头
- 设置Cookies
- 发送Form表单
- 发送JSON数据
- 上传文件
- 设置Basic认证
- 设置Bearer令牌
- 设置默认请求选项
- 自定义HTTP客户端
- 并发安全
设置参数
data, err := sreq. Get("httpbin.org/get", sreq.With params (sreq.Value{ "key1": "value1", "key2": "value2", }), ). Text() if err != nil { panic(err) } fmt.Println(data)
设置请求头
data, err := sreq. Get("httpbin.org/get", sreq.WithHeaders(sreq.Value{ "Origin": "", "Referer": "", }), ). Text() if err != nil { panic(err) } fmt.Println(data)
设置 Cookie s
data, err := sreq. Get("httpbin.org/cookies", sreq.WithCookies( &http.Cookie{ Name: "name1", Value: "value1", }, &http.Cookie{ Name: "name2", Value: "value2", }, ), ). Text() if err != nil { panic(err) } fmt.Println(data)
发送Form表单
data, err := sreq. Post("httpbin.org/post", sreq.WithForm(sreq.Value{ "key1": "value1", "key2": "value2", }), ). Text() if err != nil { panic(err) } fmt.Println(data)
发送JSON数据
data, err := sreq. Post("httpbin.org/post", sreq.WithJSON(sreq.Data{ "msg": "hello world", "num": 2019, }), ). Text() if err != nil { panic(err) } fmt.Println(data)
上传文件
data, err := sreq. Post("httpbin.org/post", sreq.With File s( &sreq.File{ FieldName: "testimage1", FileName: "testimage1. jpg ", FilePath: "./testdata/testimage1.jpg", }, &sreq.File{ FieldName: "testimage2", FileName: "testimage2.jpg", FilePath: "./testdata/testimage2.jpg", }, )). Text() if err != nil { panic(err) } fmt.Println(data)
设置Basic认证
data, err := sreq. Get("httpbin.org/basic-auth/admin/pass", sreq.WithBasicAuth("admin", "pass"), ). Text() if err != nil { panic(err) } fmt.Println(data)
设置Bearer令牌
data, err := sreq. Get("httpbin.org/bearer", sreq.WithBearerToken("sreq"), ). Text() if err != nil { panic(err) } fmt.Println(data)
设置默认请求选项
如果你希望每个HTTP请求都带上一些默认选项,可以这样做:
sreq.SetDefault Request Opts(
sreq.WithParams(sreq.Value{
"defaultKey1": "defaultValue1",
"defaultKey2": "defaultValue2",
}),
)
data, err := sreq.
Get("httpbin.org/get").
Text()
if err != nil {
panic(err)
}
fmt.Println(data)
自定义HTTP客户端
sreq 没有提供直接修改传输层、重定向策略、cookie jar、超时、代理或者其它能通过构造 *http.Client 实现配置的API,你可以通过自定义 sreq 客户端来设置它们。
transport := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).DialContext, MaxIdleConns: 100, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, } redirectPolicy := func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse } jar, _ := cookiejar.New(&cookiejar.Options{ PublicSuffixList: publicsuffix.List, }) timeout := 120 * time.Second httpClient := &http.Client{ Transport: transport, CheckRedirect: redirectPolicy, Jar: jar, Timeout: timeout, } req := sreq.New(httpClient) data, err := req. Get("httpbin.org/get"). Text() if err != nil { panic(err) } fmt.Println(data)
并发安全
sreq 是并发安全的,你可以无障碍地在goroutines中使用它。
const MaxWorker = 1000 wg := new(sync.WaitGroup) for i := 0; i < MaxWorker; i++ { wg.Add(1) go func(i int) { defer wg.Done() params := sreq.Value{} params.Set(fmt.Sprintf("key%d", i), fmt.Sprintf("value%d", i)) data, err := sreq. Get("httpbin.org/get", sreq.WithParams(params), ). Text() if err != nil { return } fmt.Println(data) }(i) } wg.Wait()
更多使用方法可以查看官方文档
开源地址:
更多更优质的资讯,请关注我,你的支持会鼓励我不断分享更多更好的优质文章。