首页 > 科技 > sreq - 一个简单,易用和线程安全的 Golang 网络请求库

sreq - 一个简单,易用和线程安全的 Golang 网络请求库

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

setTimeout(function () { fetch('http://www.sosokankan.com/stat/article.html?articleId=' + MIP.getData('articleId')) .then(function () { }) }, 3 * 1000)