轻量实用的golang请求库,不附带任何第三方库,完全使用标准库实现,让retry变得简单,让并发变得简单。
go.mod文件加入以下代码,然后执行go mod tidy
github.com/huxinggg/maxrequest latest
package main
import (
"fmt"
"gitee.com/justin0218/maxrequest"
)
type Result struct {
Code int `json:"code"`
Data interface{} `json:"data"`
}
func main() {
var ret Result
url := "http://xxx.xx"
resp, body, err := maxrequest.New().Get(url).Result(&ret)
fmt.Println(resp.StatusCode)
fmt.Println(string(body))
fmt.Println(err)
fmt.Printf("%+v\n", ret)
}
package main
import (
"fmt"
"gitee.com/justin0218/maxrequest"
)
type Result struct {
Code int `json:"code"`
Data interface{} `json:"data"`
}
type PostData struct {
UserName string `json:"user_name"`
Password string `json:"password"`
}
func main() {
var req PostData
req.UserName = "测试"
req.Password = "xxsssss"
var ret Result
url := "http://xxx.xx"
resp, body, err := maxrequest.New().Post(url, req).Result(&ret)
fmt.Println(resp.StatusCode)
fmt.Println(string(body))
fmt.Println(err)
fmt.Printf("%+v\n", ret)
}
只需要把"Post()"改成"PostForm()"
func main() {
var req PostData
req.UserName = "测试"
req.Password = "xxsssss"
var ret Result
url := "http://xxx.xx"
resp, body, err := maxrequest.New().SetTimeout(10).SetRetry(3,3, nil).PostForm(url, req).Result(&ret)
fmt.Println(resp.StatusCode)
fmt.Println(string(body))
fmt.Println(err)
fmt.Printf("%+v\n", ret)
}
设置了10秒超时
resp, body, err := maxrequest.New().SetTimeout(10).Post(url, req).Result(&ret)
SetRetry第一个参数为重试次数,第二个参数为重试周期,单位:秒
package main
import (
"fmt"
"gitee.com/justin0218/maxrequest"
)
type Result struct {
Code int `json:"code" maxrequestRetry:"404"` //代表返回code=404时,将会进行重试,多个字段设置maxrequestRetry,其中一个满足就会进行重试
Data interface{} `json:"data"`
}
type PostData struct {
UserName string `json:"user_name"`
Password string `json:"password"`
}
func main() {
var req PostData
req.UserName = "测试"
req.Password = "xxsssss"
var ret Result
url := "http://xxx.xx"
resp, body, err := maxrequest.New().SetTimeout(10).SetRetry(3, 3, func(retryNotice maxrequest.RetryNotice) bool {
fmt.Printf("重试次数:%d", retryNotice.Num)
return false //return true 可以随时终止重试
}).Post(url, req).Result(&ret)
fmt.Println(resp.StatusCode)
fmt.Println(string(body))
fmt.Println(err)
fmt.Printf("%+v\n", ret)
}
同时发起多个请求,一次性拿到所有结果
func main() {
var req PostData
req.UserName = "测试"
req.Password = "xxsssss"
url := "http://xxx.xx"
r1 := maxrequest.New().SetTimeout(10).SetRetry(3, 3, nil).Post(url, req)
r2 := maxrequest.New().SetTimeout(10).SetRetry(3, 3, nil).Post(url, req)
r3 := maxrequest.New().SetTimeout(10).SetRetry(3, 3, nil).Post(url, req)
r4 := maxrequest.New().SetTimeout(10).SetRetry(3, 3, nil).Post(url, req)
r5 := maxrequest.New().SetTimeout(10).SetRetry(3, 3, nil).Post(url, req)
results := maxrequest.Go(r1, r2, r3, r4, r5)
fmt.Println("所有请求结果:%v", results)
}
- 只有在Result()方法内传入带有maxrequestRetry的tag才会触发重试机制;
- Result()传入的结构体,只会解析json tag,如需解析其他数据类型,例如:xml,Result内请传入nil,然后自己根据返回的body自行解析;
- 如需发送非json请求,例如xml,可把Post方法的第二个参数直接传入bytes;
- 并发的结果和发送的请求顺序相同,雷同于JavaScript的Promise.all。