maxrequest让retry变得简单,让并发变得简单

maxrequest

介绍

轻量实用的golang请求库,不附带任何第三方库,完全使用标准库实现,让retry变得简单,让并发变得简单。

安装教程

go.mod文件加入以下代码,然后执行go mod tidy

github.com/huxinggg/maxrequest latest
发起GET请求
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)
}
发起POST请求

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


form-data请求

只需要把"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)
}

注意
  1. 只有在Result()方法内传入带有maxrequestRetry的tag才会触发重试机制;
  2. Result()传入的结构体,只会解析json tag,如需解析其他数据类型,例如:xml,Result内请传入nil,然后自己根据返回的body自行解析;
  3. 如需发送非json请求,例如xml,可把Post方法的第二个参数直接传入bytes;
  4. 并发的结果和发送的请求顺序相同,雷同于JavaScript的Promise.all。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值