193 lines
5.2 KiB
Go
193 lines
5.2 KiB
Go
package httpclient
|
|
|
|
// http request 工具函数
|
|
import (
|
|
"crypto/tls"
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"net/url"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/bytedance/sonic"
|
|
"github.com/valyala/fasthttp"
|
|
"github.com/valyala/fasthttp/fasthttpproxy"
|
|
)
|
|
|
|
var (
|
|
fastHttpClient = &fasthttp.Client{
|
|
Name: "http",
|
|
MaxConnsPerHost: 10000,
|
|
MaxIdleConnDuration: 30 * time.Second,
|
|
ReadTimeout: 50 * time.Second,
|
|
WriteTimeout: 50 * time.Second,
|
|
TLSConfig: &tls.Config{InsecureSkipVerify: true},
|
|
}
|
|
socksDialer fasthttp.DialFunc
|
|
proxyUrl = ""
|
|
proxyScheme = "socks5"
|
|
)
|
|
|
|
func NewHttpRequestWithFasthttp(reqMethod, reqUrl, postData string, headers map[string]string) ([]byte, error) {
|
|
// loghelper.InfoLog("use fasthttp client")
|
|
if len(proxyUrl) > 0 {
|
|
|
|
if socksDialer == nil {
|
|
socksDialer = fasthttpproxy.FasthttpSocksDialer(strings.TrimPrefix(proxyUrl, proxyScheme+"://"))
|
|
fastHttpClient.Dial = socksDialer
|
|
}
|
|
}
|
|
req := fasthttp.AcquireRequest()
|
|
resp := fasthttp.AcquireResponse()
|
|
defer func() {
|
|
fasthttp.ReleaseRequest(req)
|
|
fasthttp.ReleaseResponse(resp)
|
|
}()
|
|
|
|
for k, v := range headers {
|
|
req.Header.Set(k, v)
|
|
}
|
|
req.Header.SetMethod(reqMethod)
|
|
req.SetRequestURI(reqUrl)
|
|
req.SetBodyString(postData)
|
|
|
|
err := fastHttpClient.Do(req, resp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if resp.StatusCode() != 200 {
|
|
return nil, errors.New(fmt.Sprintf("HttpStatusCode:%d ,Desc:%s", resp.StatusCode(), string(resp.Body())))
|
|
}
|
|
return resp.Body(), nil
|
|
}
|
|
|
|
func HttpGet(reqUrl string) (map[string]interface{}, error) {
|
|
respData, err := NewHttpRequestWithFasthttp("GET", reqUrl, "", nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var bodyDataMap map[string]interface{}
|
|
err = sonic.Unmarshal(respData, &bodyDataMap)
|
|
if err != nil {
|
|
log.Println(string(respData))
|
|
return nil, err
|
|
}
|
|
return bodyDataMap, nil
|
|
}
|
|
|
|
func HttpGet2(reqUrl string, headers map[string]string) (map[string]interface{}, error) {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
respData, err := NewHttpRequestWithFasthttp("GET", reqUrl, "", headers)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var bodyDataMap map[string]interface{}
|
|
err = sonic.Unmarshal(respData, &bodyDataMap)
|
|
if err != nil {
|
|
log.Println("respData", string(respData))
|
|
return nil, err
|
|
}
|
|
return bodyDataMap, nil
|
|
}
|
|
|
|
func HttpGet3(reqUrl string, headers map[string]string) ([]interface{}, error) {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
respData, err := NewHttpRequestWithFasthttp("GET", reqUrl, "", headers)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// println(string(respData))
|
|
var bodyDataMap []interface{}
|
|
err = sonic.Unmarshal(respData, &bodyDataMap)
|
|
if err != nil {
|
|
log.Println("respData", string(respData))
|
|
return nil, err
|
|
}
|
|
return bodyDataMap, nil
|
|
}
|
|
|
|
func HttpGet4(reqUrl string, headers map[string]string, result interface{}) error {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
respData, err := NewHttpRequestWithFasthttp("GET", reqUrl, "", headers)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = sonic.Unmarshal(respData, result)
|
|
if err != nil {
|
|
log.Printf("HttpGet4 - jsonhelper.Unmarshal failed : %v, resp %s", err, string(respData))
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func HttpGet5(reqUrl string, headers map[string]string) ([]byte, error) {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
respData, err := NewHttpRequestWithFasthttp("GET", reqUrl, "", headers)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return respData, nil
|
|
}
|
|
|
|
func HttpPostForm(reqUrl string, postData url.Values) ([]byte, error) {
|
|
headers := map[string]string{
|
|
"Content-Type": "application/x-www-form-urlencoded"}
|
|
return NewHttpRequestWithFasthttp("POST", reqUrl, postData.Encode(), headers)
|
|
}
|
|
|
|
func HttpPostForm2(reqUrl string, postData url.Values, headers map[string]string) ([]byte, error) {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
return NewHttpRequestWithFasthttp("POST", reqUrl, postData.Encode(), headers)
|
|
}
|
|
|
|
func HttpPostForm3(reqUrl string, postData string, headers map[string]string) ([]byte, error) {
|
|
return NewHttpRequestWithFasthttp("POST", reqUrl, postData, headers)
|
|
}
|
|
|
|
func HttpPostForm4(reqUrl string, postData map[string]string, headers map[string]string) ([]byte, error) {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/json"
|
|
data, _ := sonic.Marshal(postData)
|
|
return NewHttpRequestWithFasthttp("POST", reqUrl, string(data), headers)
|
|
}
|
|
|
|
func HttpDeleteForm(reqUrl string, postData url.Values, headers map[string]string) ([]byte, error) {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
return NewHttpRequestWithFasthttp("DELETE", reqUrl, postData.Encode(), headers)
|
|
}
|
|
|
|
func HttpPut(reqUrl string, postData url.Values, headers map[string]string) ([]byte, error) {
|
|
if headers == nil {
|
|
headers = map[string]string{}
|
|
}
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
return NewHttpRequestWithFasthttp("PUT", reqUrl, postData.Encode(), headers)
|
|
}
|