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))
}
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))
}
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