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