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("http://www.baidu.com")
使用 sreq 你只须这样:
resp, err := sreq.Get("http://www.baidu.com").Resolve()
更多的示例:
- 设置参数
- 设置请求头
- 设置Cookies
- 发送Form表单
- 发送JSON数据
- 上传文件
- 设置Basic认证
- 设置Bearer令牌
- 设置默认请求选项
- 自定义HTTP客户端
- 并发安全
设置参数
data, err := sreq.
Get("httpbin.org/get",
sreq.WithParams(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": "http://httpbin.org",
"Referer": "http://httpbin.org",
}),
).
Text()
if err != nil {
panic(err)
}
fmt.Println(data)
设置Cookies
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.WithFiles(
&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.SetDefaultRequestOpts(
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 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()
更多使用方法可以查看官方文档
开源地址:
https://github.com/winterssy/sreq
更多更优质的资讯,请关注我,你的支持会鼓励我不断分享更多更好的优质文章。
本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/1967556.html