GO 發起HTTPS請求調用接口


GO 發起HTTPS請求調用接口

GO 發起HTTPS請求調用接口

一、GET請求調用HTTPS接口

  • tls.LoadX509KeyPair()方法讀取證書路徑,轉換為證書對象;
  • x509.NewCertPool()方法創建證書池;
  • pool.AppendCertsFromPEM(caCrt)方法將根證書加入到證書池中。
  • curl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/healthcheck-client.crt --key /etc/kubernetes/pki/etcd/healthcheck-client.key https://192.168.1.70:2379/metrics -k
package main

import (
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io/ioutil"
	"net/http"
)

func GetHttps(url, caCertPath, certFile, keyFile string) ([]byte, error) {
	var (
		// 創建證書池及各類對象
		pool   *x509.CertPool // 我們要把一部分證書存到這個池中
		client *http.Client
		resp   *http.Response
		body   []byte
		err    error
		caCrt  []byte          // 根證書
		cliCrt tls.Certificate // 具體的證書加載對象
	)
	// 讀取caCertPath
	caCrt, err = ioutil.ReadFile(caCertPath)
	if err != nil {
		return nil, err
	}

	// NewCertPool
	pool = x509.NewCertPool()

	// 解析一系列PEM編碼的證書
	pool.AppendCertsFromPEM(caCrt)

	// 具體的證書加載對象
	cliCrt, err = tls.LoadX509KeyPair(certFile, keyFile)
	if err != nil {
		return nil, err
	}

	// 把上面的准備內容傳入 client
	client = &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				RootCAs:      pool,
				Certificates: []tls.Certificate{cliCrt},
			},
		},
	}

	// Get 請求
	resp, err = client.Get(url)
	if err != nil {
		return nil, err
	}
	// 延時關閉
	defer resp.Body.Close()

	// 讀取
	body, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	// 延時關閉
	defer client.CloseIdleConnections()

	return body, nil
}

func main() {
	resp, err := GetHttps("https://192.168.1.70:2379/metrics", "./ca_file/ca.crt", "./ca_file/healthcheck-client.crt", "./ca_file/healthcheck-client.key")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(resp))
}

二、在 Header 中添加 token 的 HTTPS 請求

func GetHttpsSkip(url, token string) ([]byte, error) {

	// 創建各類對象
	var (
		client  *http.Client
		request *http.Request
		resp    *http.Response
		body    []byte
		err     error
	)

	// 這里請注意,使用 InsecureSkipVerify: true 來跳過證書驗證
	client = &http.Client{Transport: &http.Transport{
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true,
		},
	}}

	// 獲取 request請求
	request, err = http.NewRequest("GET", url, nil)

	if err != nil {
		log.Println("GetHttpSkip Request Error:", err)
		return nil, nil
	}

	// 加入 token; Authorization、accessToken看你接口的請求頭是什么了
	request.Header.Add("accessToken", token)
	resp, err = client.Do(request)
	if err != nil {
		log.Println("GetHttpSkip Response Error:", err)
		return nil, nil
	}

	// 延遲關閉
	defer resp.Body.Close()

	body, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Println("ReadAll resp.Body Error:", err)
		return nil, nil
	}

	fmt.Println(resp.StatusCode)

	// 延遲關閉
	defer client.CloseIdleConnections()
	return body, nil
}

func main() {
	urlx := "https://xxxx"
	tokenx := "xxxx"

	resp, _ := GetHttpsSkip(urlx, tokenx)
	fmt.Println(string(resp))
}

三、在 Header 中添加 token 的 HTTPS的POST 請求

func main() {
	urlx := "https://xxx"
	tokenx := "xxxx"

	// 創建各類對象
	var (
		client  *http.Client
		request *http.Request
		resp    *http.Response
		body    []byte
		err     error
	)

	// 這里請注意,使用 InsecureSkipVerify: true 來跳過證書驗證
	client = &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				InsecureSkipVerify: true,
			},
		}}

	
	// 參數
    s := []int{1}
	data := make(map[string]interface{})

	data["x"] = "x"
	data["x"] = "x"
	data["x"] = "x"
	data["x"] = "x"
	data["x"] = s
	data["x"] = 1
	data["x"] = "x"

	// Marshal
	bytesData, _ := json.Marshal(data)

	// 獲取 request請求
	if request, err = http.NewRequest("POST", urlx, bytes.NewReader(bytesData)); err != nil {
		log.Println("GetHttpSkip Request Error:", err)
		return
	}

	// 加入 token; Authorization、accessToken看你接口的請求頭是什么了
	request.Header.Add("accessToken", tokenx)
    // 請求格式json
	request.Header.Add("content-type", "application/json")
	if resp, err = client.Do(request); err != nil {
		log.Println("GetHttpSkip Response Error:", err)
		return
	}

	// 延遲關閉
	defer resp.Body.Close()

	if body, err = ioutil.ReadAll(resp.Body); err != nil {
		log.Println("ReadAll resp.Body Error:", err)
		return
	}

	fmt.Println(string(body), resp.StatusCode)
	// 延遲關閉
	defer client.CloseIdleConnections()
}

參考:https://blog.csdn.net/Liing0/article/details/111241280


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM