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請求實質還可以寫到一個函數中,這裏爲了調用清晰特地按類分開。