参数phoneList类型为[]ReqData,json串的列表;
client初始化的那些参数是为了防止丢包
package main
import (
"encoding/json"
"errors"
"github.com/avast/retry-go/v4"
"io"
"log"
"net"
"net/http"
"net/url"
"time"
)
const reqUrl = ""
var (
msg []string
client *http.Client
)
type ReqData struct {
Phone string `json:"phone"`
}
func params() {
tr := &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,
}
client = &http.Client{Transport: tr}
}
func req(dataList []string) {
values := url.Values{}
var phoneList []ReqData
for _, item := range dataList {
clue := ReqData{
Phone: item,
}
phoneList = append(phoneList, clue)
}
reqdata, _ := json.Marshal(phoneList)
values.Set("name", "name1")
values.Set("age", "18")
values.Set("phoneList", string(reqdata))
log.Println(values)
resp, err := client.PostForm(reqUrl, values) //reqUrl替换成你使用的url
if err != nil {
log.Println(err)
return
}
defer resp.Body.Close()
str, _ := io.ReadAll(resp.Body)
if resp.StatusCode != http.StatusOK {
log.Println(string(str))
return
}
//接下来可以解析响应数据了
log.Println(string(str))
}
func main() {
params()
var dataList []string
dataList = append(dataList, "137********", "138********")
req(dataList)
}
如果想增加http请求重试的话,req方法可以参考如下代码:
retry.Attempts(3)表示重试3次,后面还可以增加其他参数,例如重试间隔时间等等。
retry还有retry.Do()方法。
func req(dataList []string) {
values := url.Values{}
var phoneList []ReqData
for _, item := range dataList {
clue := ReqData{
Phone: item,
}
phoneList = append(phoneList, clue)
}
reqdata, _ := json.Marshal(phoneList)
values.Set("name", "name1")
values.Set("age", "18")
values.Set("phoneList", string(reqdata))
log.Println(values)
str, err := retry.DoWithData(func() ([]byte, error) {
resp, err := client.PostForm(reqUrl, values) //reqUrl替换成你使用的url
if err != nil {
log.Println(err)
return nil, err
}
defer resp.Body.Close()
str, _ := io.ReadAll(resp.Body)
if resp.StatusCode != http.StatusOK {
log.Println(string(str))
return nil, errors.New(string(str))
}
return str, nil
}, retry.Attempts(3))
if err != nil {
log.Fatal(err.Error())
}
//接下来可以解析响应数据了
log.Println(string(str))
}