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)
 
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)
 
data, err := sreq.
 Post("httpbin.org/post",
 sreq.WithForm(sreq.Value{
 "key1": "value1",
 "key2": "value2",
 }),
 ).
 Text()
if err != nil {
 panic(err)
}
fmt.Println(data)
 
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)
 
data, err := sreq.
 Get("httpbin.org/basic-auth/admin/pass",
 sreq.WithBasicAuth("admin", "pass"),
 ).
 Text()
if err != nil {
 panic(err)
}
fmt.Println(data)
 
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)
 

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()
 

更多使用方法可以查看官方文档

 

更多更优质的资讯,请关注我,你的支持会鼓励我不断分享更多更好的优质文章。