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