237 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			237 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package httpclient
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"bytes"
							 | 
						||
| 
								 | 
							
									"crypto/tls"
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"io/ioutil"
							 | 
						||
| 
								 | 
							
									"net/http"
							 | 
						||
| 
								 | 
							
									"net/url"
							 | 
						||
| 
								 | 
							
									"strings"
							 | 
						||
| 
								 | 
							
									"time"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"go.uber.org/zap"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									log "github.com/go-admin-team/go-admin-core/logger"
							 | 
						||
| 
								 | 
							
									"github.com/valyala/fasthttp"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var (
							 | 
						||
| 
								 | 
							
									client     = &fasthttp.Client{MaxConnsPerHost: 1000000, TLSConfig: &tls.Config{InsecureSkipVerify: true}, ReadTimeout: time.Second * 60, MaxIdemponentCallAttempts: 0}
							 | 
						||
| 
								 | 
							
									clientForm = &fasthttp.Client{MaxConnsPerHost: 1000000, TLSConfig: &tls.Config{InsecureSkipVerify: true}, ReadTimeout: time.Second * 60, MaxIdemponentCallAttempts: 0}
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// JumioPostBasicAuth
							 | 
						||
| 
								 | 
							
								func JumioPostBasicAuth(uri, username, password string, data url.Values) ([]byte, error) {
							 | 
						||
| 
								 | 
							
									client := &http.Client{
							 | 
						||
| 
								 | 
							
										Timeout: time.Second * 10,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									req, err := http.NewRequest("POST", uri, strings.NewReader(data.Encode()))
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									req.SetBasicAuth(username, password)
							 | 
						||
| 
								 | 
							
									req.Header.Set("Accept", "application/json")
							 | 
						||
| 
								 | 
							
									req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									response, err := client.Do(req)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									defer response.Body.Close()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									body, _ := ioutil.ReadAll(response.Body)
							 | 
						||
| 
								 | 
							
									return body, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// JumioPostOauth
							 | 
						||
| 
								 | 
							
								func JumioPostOauth(uri, token string, data []byte) ([]byte, error) {
							 | 
						||
| 
								 | 
							
									client := &http.Client{
							 | 
						||
| 
								 | 
							
										Timeout: time.Second * 10,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									req, err := http.NewRequest("POST", uri, bytes.NewReader(data))
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									req.Header.Set("Authorization", fmt.Sprintf("Bearer %v", token))
							 | 
						||
| 
								 | 
							
									req.Header.Set("User-Agent", "myapp-v1.0.0")
							 | 
						||
| 
								 | 
							
									req.Header.Set("Accept", "*/*")
							 | 
						||
| 
								 | 
							
									req.Header.Set("Content-Type", "application/json")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									response, err := client.Do(req)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									defer response.Body.Close()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									body, _ := ioutil.ReadAll(response.Body)
							 | 
						||
| 
								 | 
							
									return body, nil
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// JumioHttp
							 | 
						||
| 
								 | 
							
								func JumioHttp(method, uri, accessToken string, data url.Values) ([]byte, error) {
							 | 
						||
| 
								 | 
							
									client := &http.Client{
							 | 
						||
| 
								 | 
							
										Timeout: time.Second * 10,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									req, err := http.NewRequest(method, uri, strings.NewReader(data.Encode()))
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									req.Header.Set("Authorization", fmt.Sprintf("Bearer %v", accessToken))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									response, err := client.Do(req)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									defer response.Body.Close()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									body, _ := ioutil.ReadAll(response.Body)
							 | 
						||
| 
								 | 
							
									xx := string(body)
							 | 
						||
| 
								 | 
							
									fmt.Println(xx)
							 | 
						||
| 
								 | 
							
									return body, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// FastPostByte  do application/json POST request via fasthttp
							 | 
						||
| 
								 | 
							
								func FastPostByte(url string, body []byte) ([]byte, error) {
							 | 
						||
| 
								 | 
							
									req := fasthttp.AcquireRequest()
							 | 
						||
| 
								 | 
							
									resp := fasthttp.AcquireResponse()
							 | 
						||
| 
								 | 
							
									defer func() {
							 | 
						||
| 
								 | 
							
										fasthttp.ReleaseResponse(resp)
							 | 
						||
| 
								 | 
							
										fasthttp.ReleaseRequest(req)
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
									req.SetRequestURI(url)
							 | 
						||
| 
								 | 
							
									//req.Header.SetContentType("application/x-www-form-urlencoded")
							 | 
						||
| 
								 | 
							
									req.Header.SetContentType("application/json; charset=utf-8")
							 | 
						||
| 
								 | 
							
									req.Header.Add("Accept", "application/json")
							 | 
						||
| 
								 | 
							
									// if w.Authentication && len(w.JwtToken) > 0 {
							 | 
						||
| 
								 | 
							
									// 	req.Header.Set("Authorization", "Bearer "+w.JwtToken)
							 | 
						||
| 
								 | 
							
									// }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									req.Header.SetMethod("POST")
							 | 
						||
| 
								 | 
							
									req.SetBody(body)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// if !loghelper.LevelIsError() {
							 | 
						||
| 
								 | 
							
									//	loghelper.InfoLog("FastPostByte:", string(body))
							 | 
						||
| 
								 | 
							
									// }
							 | 
						||
| 
								 | 
							
									err := client.Do(req, resp)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									recbody := resp.Body()
							 | 
						||
| 
								 | 
							
									arr := make([]byte, len(recbody))
							 | 
						||
| 
								 | 
							
									copy(arr, recbody)
							 | 
						||
| 
								 | 
							
									return arr, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// FastGet Fast Get
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//	@params header 格式 []string{
							 | 
						||
| 
								 | 
							
								//		 "key:value",
							 | 
						||
| 
								 | 
							
								//		 "key:value",
							 | 
						||
| 
								 | 
							
								//	}
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// @return "中国,深圳"
							 | 
						||
| 
								 | 
							
								func FastGet(url string, header ...string) ([]byte, error) {
							 | 
						||
| 
								 | 
							
									req := fasthttp.AcquireRequest()
							 | 
						||
| 
								 | 
							
									resp := fasthttp.AcquireResponse()
							 | 
						||
| 
								 | 
							
									defer func() {
							 | 
						||
| 
								 | 
							
										fasthttp.ReleaseResponse(resp)
							 | 
						||
| 
								 | 
							
										fasthttp.ReleaseRequest(req)
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
									req.SetRequestURI(url)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// if w.Authentication && len(w.JwtToken) > 0 {
							 | 
						||
| 
								 | 
							
									// 	req.Header.Set("Authorization", "Bearer "+w.JwtToken)
							 | 
						||
| 
								 | 
							
									// }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for _, h := range header {
							 | 
						||
| 
								 | 
							
										kv := strings.Split(h, ":")
							 | 
						||
| 
								 | 
							
										req.Header.Set(kv[0], kv[1])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// define webapi client request Method
							 | 
						||
| 
								 | 
							
									req.Header.SetMethod("GET")
							 | 
						||
| 
								 | 
							
									// DO GET request
							 | 
						||
| 
								 | 
							
									err := client.Do(req, resp)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									body := resp.Body()
							 | 
						||
| 
								 | 
							
									// arr := make([]byte, len(body))
							 | 
						||
| 
								 | 
							
									// copy(arr, body)
							 | 
						||
| 
								 | 
							
									return body, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// fastFormPost  do  POST request via fasthttp
							 | 
						||
| 
								 | 
							
								func fastFormPost(url string, parmlist map[string]string) (*fasthttp.Response, error) {
							 | 
						||
| 
								 | 
							
									req := fasthttp.AcquireRequest()
							 | 
						||
| 
								 | 
							
									resp := fasthttp.AcquireResponse()
							 | 
						||
| 
								 | 
							
									defer func() {
							 | 
						||
| 
								 | 
							
										fasthttp.ReleaseResponse(resp)
							 | 
						||
| 
								 | 
							
										fasthttp.ReleaseRequest(req)
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
									req.SetRequestURI(url)
							 | 
						||
| 
								 | 
							
									// if w.Authentication && len(w.JwtToken) > 0 {
							 | 
						||
| 
								 | 
							
									// 	req.Header.Set("Authorization", "Bearer "+w.JwtToken)
							 | 
						||
| 
								 | 
							
									// }
							 | 
						||
| 
								 | 
							
									req.Header.SetMethod("POST")
							 | 
						||
| 
								 | 
							
									args := req.PostArgs()
							 | 
						||
| 
								 | 
							
									for k, v := range parmlist {
							 | 
						||
| 
								 | 
							
										args.Set(k, v)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									err := clientForm.Do(req, resp) // fasthttp.DoTimeout(req, resp, timeOut)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										log.Error("post request error", zap.Error(err))
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									out := fasthttp.AcquireResponse()
							 | 
						||
| 
								 | 
							
									resp.CopyTo(out)
							 | 
						||
| 
								 | 
							
									return out, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// PostForm do  POST request via fasthttp
							 | 
						||
| 
								 | 
							
								func PostForm(url string, parmlist map[string]string) ([]byte, error) {
							 | 
						||
| 
								 | 
							
									resp, err := fastFormPost(url, parmlist)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									arr := make([]byte, len(resp.Body()))
							 | 
						||
| 
								 | 
							
									copy(arr, resp.Body())
							 | 
						||
| 
								 | 
							
									// defer fasthttp.ReleaseResponse(resp)
							 | 
						||
| 
								 | 
							
									// return resp.Body()
							 | 
						||
| 
								 | 
							
									return arr, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ClientIP 获取真实的IP  1.1.1.1, 2.2.2.2, 3.3.3.3
							 | 
						||
| 
								 | 
							
								func ClientIP(ctx *fasthttp.RequestCtx) string {
							 | 
						||
| 
								 | 
							
									clientIP := string(ctx.Request.Header.Peek("X-Forwarded-For"))
							 | 
						||
| 
								 | 
							
									if index := strings.IndexByte(clientIP, ','); index >= 0 {
							 | 
						||
| 
								 | 
							
										clientIP = clientIP[0:index]
							 | 
						||
| 
								 | 
							
										// 获取最开始的一个 即 1.1.1.1
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									clientIP = strings.TrimSpace(clientIP)
							 | 
						||
| 
								 | 
							
									if len(clientIP) > 0 {
							 | 
						||
| 
								 | 
							
										return clientIP
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									clientIP = strings.TrimSpace(string(ctx.Request.Header.Peek("X-Real-Ip")))
							 | 
						||
| 
								 | 
							
									if len(clientIP) > 0 {
							 | 
						||
| 
								 | 
							
										return clientIP
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return ctx.RemoteIP().String()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// MergeQuery appends additional query values to an existing URL.
							 | 
						||
| 
								 | 
							
								func MergeQuery(u url.URL, q url.Values) url.URL {
							 | 
						||
| 
								 | 
							
									uv := u.Query()
							 | 
						||
| 
								 | 
							
									for k, vs := range q {
							 | 
						||
| 
								 | 
							
										for _, v := range vs {
							 | 
						||
| 
								 | 
							
											uv.Add(k, v)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									u.RawQuery = uv.Encode()
							 | 
						||
| 
								 | 
							
									return u
							 | 
						||
| 
								 | 
							
								}
							 |