zoukankan      html  css  js  c++  java
  • 紫色飞猪的研发之旅--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
    }
    
    过手如登山,一步一重天
  • 相关阅读:
    Linux文件系统的层级结构
    3.求m+mm+mmm+…+m…m(n个)的和,其中m为1~9之间的整数。 例如,当m=3、n=4时,求3+33+333+3333的和。
    编写一个Java程序,计算一下1,2,…,9这9个数字可以组成多少个互不相同的、无重复数字的三位偶数。
    抽象类和抽象方法
    定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
    (1)定义一个接口CanFly,描述会飞的方法public void fly(); (2)分别定义类飞机和鸟,实现CanFly接口。 (3)定义一个测试类,测试飞机和鸟,在main方法中创建飞机对象和鸟对象, 再定义一个makeFly()方法,其中让会飞的事物飞。并在main方法中调用该方法, 让飞机和鸟起飞。
    (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) (4)设计一个测试类
    完成Adventure中的主方法
    中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。
    (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n!); (4)编写测试类E测试
  • 原文地址:https://www.cnblogs.com/zisefeizhu/p/15223287.html
Copyright © 2011-2022 走看看