紫色飛豬的研發之旅--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請求實質還可以寫到一個函數中,這裏爲了調用清晰特地按類分開。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章