紫色飞猪的研发之旅--05go封装http请求

package middleware

import (
	"go/pkg/errno"
	"go/pkg/getcookie"
	"crypto/tls"
	"fmt"
	"io/ioutil"
	"net"
	"net/http"
	"strings"

	"errors"
	"time"
)

// request.Header.Set 与request.Header.Add 区别:https://www.cnblogs.com/Dong-Ge/articles/11269898.html

type HTTPClient interface {
	Do(req *http.Request) (*http.Response, error)
}

var (
	Client HTTPClient
)

func init() {
	Client = &http.Client{
		Timeout: 3 * time.Second,
		//忽略https证书
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
			Proxy:           http.ProxyFromEnvironment,
			DialContext: (&net.Dialer{
				Timeout:   1 * time.Second,
				KeepAlive: 30 * time.Second, // HTTp keeplive
				DualStack: true,
			}).DialContext,
			MaxIdleConns:        100,
			MaxIdleConnsPerHost: 8,
			IdleConnTimeout:     120 * time.Second,
		},
	}
}

// CheckRespStatus 状态检查
func CheckRespStatus(resp *http.Response) ([]byte, error) {
	bodyBytes, _ := ioutil.ReadAll(resp.Body)

	if resp.StatusCode >= 200 && resp.StatusCode < 400 {
		return bodyBytes, nil
	}
	return bodyBytes, errno.New(errno.InternalServerError, errors.New(string(bodyBytes)))
}

// GetRequest 建立Get请求
func GetRequest(url string, headerSet map[string]string) (respStatusCode int, respBytes []byte, err error) {
	// 提交请求
	request, err := http.NewRequest("GET", url, nil)
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return
	}

	// 添加token
	// request.Header.Set("Authorization", "Bearer " + token)

	// 添加cookie
	cookieName, cookieValue := getcookie.GetCookie()
	cookie := &http.Cookie{Name: cookieName, Value: cookieValue, HttpOnly: true}
	request.AddCookie(cookie)

	// header 添加字段
	if headerSet != nil {
		for k, v := range headerSet {
			// request.Header.Set 与request.Header.Add 区别:https://www.cnblogs.com/Dong-Ge/articles/11269898.html
			request.Header.Set(k, v)
		}
	}

	// 处理返回结果
	resp, err := Client.Do(request)
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return 0, nil, err
	}
	defer resp.Body.Close()
	// 返回的状态码
	respBytes, err = CheckRespStatus(resp)
	respStatusCode = resp.StatusCode
	return
}

// PostRequest 建立Post请求
func PostRequest(url, body string, headerSet map[string]string) (respStatusCode int, respBytes []byte, err error) {
	request, err := http.NewRequest("POST", url, strings.NewReader(body))
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return
	}
	cookieName, cookieValue := getcookie.GetCookie() // 拿到cookie
	cookie := &http.Cookie{Name: cookieName, Value: cookieValue, HttpOnly: true}
	request.AddCookie(cookie)
	// header 添加字段
	if headerSet != nil {
		for k, v := range headerSet {
			// request.Header.Set 与request.Header.Add 区别:https://www.cnblogs.com/Dong-Ge/articles/11269898.html
			request.Header.Set(k, v)
		}
	}
	resp, err := Client.Do(request)
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return 0, nil, err
	}
	defer resp.Body.Close()
	// 返回的状态码
	respBytes, err = CheckRespStatus(resp)
	respStatusCode = resp.StatusCode
	return
}


// PutRequest 建立Put请求
func PutRequest(url, body string, headerSet map[string]string)  (respStatusCode int, respBytes []byte, err error) {
	request, err := http.NewRequest("PUT", url, strings.NewReader(body)); if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return
	}

	cookieName, cookieValue := getcookie.GetCookie() // 拿到cookie
	cookie := &http.Cookie{Name: cookieName, Value: cookieValue, HttpOnly: true}
	request.AddCookie(cookie)

	// header 添加字段
	if headerSet != nil {
		for k, v := range headerSet {
			request.Header.Set(k, v)
		}
	}

	resp, err := Client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		err = errno.New(errno.InternalServerError, err)
		return 0, nil, err
	}
	defer resp.Body.Close()
	//返回的状态码
	respBytes, err = CheckRespStatus(resp)
	respStatusCode = resp.StatusCode
	return
}

// PatchRequest 建立Patch请求
func PatchRequest(url, body string, headerSet map[string]string) (respStatusCode int, respBytes []byte, err error) {
	request, err := http.NewRequest("PATCH", url, strings.NewReader(body))
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return
	}
	cookieName, cookieValue := getcookie.GetCookie() // 拿到cookie
	cookie := &http.Cookie{Name: cookieName, Value: cookieValue, HttpOnly: true}
	request.AddCookie(cookie)
	// header 添加字段
	if headerSet != nil {
		for k, v := range headerSet {
			request.Header.Set(k, v)
		}
	}
	resp, err := Client.Do(request)
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return 0, nil, err
	}
	defer resp.Body.Close()

	//返回的状态码
	respBytes, err = CheckRespStatus(resp)

	respStatusCode = resp.StatusCode
	return
}

// DeleteRequest 建立Delete请求
func DeleteRequest(url, body string, headerSet map[string]string) (respStatusCode int, respBytes []byte, err error) {
	request, err := http.NewRequest("DELETE", url, strings.NewReader(body))
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return
	}

	cookiename, cookievalue := getcookie.GetCookie() // 拿到cookie
	cookie := &http.Cookie{Name: cookiename, Value: cookievalue, HttpOnly: true}
	request.AddCookie(cookie)
	// header 添加字段
	if headerSet != nil {
		for k, v := range headerSet {
			// request.Header.Set 与request.Header.Add 区别:https://www.cnblogs.com/Dong-Ge/articles/11269898.html
			request.Header.Set(k, v)
		}
	}
	resp, err := Client.Do(request)
	if err != nil {
		err = errno.New(errno.InternalServerError, err)
		return 0, nil, err
	}
	defer resp.Body.Close()
	//返回的状态码
	respBytes, err = CheckRespStatus(resp)
	respStatusCode = resp.StatusCode
	return
}
  • 注:上述五类http请求实质还可以写到一个函数中,这里为了调用清晰特地按类分开。
package middleware

import (
	"containers/pkg/getcookie"
	"crypto/tls"
	"errors"
	"io/ioutil"
	"net"
	"net/http"
	"strings"
	"time"
)

type HTTPClient interface {
	Do(req *http.Request) (*http.Response, error)
}

var (
	Client HTTPClient
)

func init() {
	Client = &http.Client{
		Timeout: 5 * time.Second,
		//忽略https证书
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
			Proxy:           http.ProxyFromEnvironment,
			DialContext: (&net.Dialer{
				Timeout:   5 * time.Second,
				KeepAlive: 30 * time.Second, // HTTp keeplive
				DualStack: true,
			}).DialContext,
			MaxIdleConns:        1000,
			MaxIdleConnsPerHost: 80,
			IdleConnTimeout:     120 * time.Second,
		},
	}
}


// CheckRespStatus 状态检查
func CheckRespStatus(resp *http.Response) ([]byte, error) {
	bodyBytes, _ := ioutil.ReadAll(resp.Body)
	if resp.StatusCode >= 200 && resp.StatusCode < 400 {
		return bodyBytes, nil
	} else {
		return nil, errors.New(string(bodyBytes))
	}
}

// Request 建立http请求
func Request(url, token ,body string, headerSet map[string]string, method  string) (respStatusCode int, respBytes []byte, err error) {
	request, err := http.NewRequest(method, url, strings.NewReader(body))
	if err != nil {
		return 401,nil,err
	}

	//添加token
	if token != "" {
		request.Header.Set("Authorization", "Bearer " + token)
	}

	// 添加cookie
	cookieName, cookieValue := getcookie.GetCookie() // 拿到cookie
	cookie := &http.Cookie{Name: cookieName, Value: cookieValue, HttpOnly: true}
	request.AddCookie(cookie)
	// header 添加字段
	if headerSet != nil {
		for k, v := range headerSet {
			request.Header.Set(k, v)
		}
	}
	resp, err := Client.Do(request)
	if err != nil {
		return 401, nil, err
	}
	defer resp.Body.Close()
	// 返回的状态码
	respBytes, err = CheckRespStatus(resp)
	respStatusCode = resp.StatusCode
	return
}
posted @ 2021-09-03 15:27  紫色飞猪  阅读(152)  评论(0编辑  收藏  举报