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