El siguiente código es un conjunto de conexiones Http implementado usando el paquete net/http, y el código completo se encuentra al final
Directorio de artículos
Crear un grupo de conexiones
Inicializar las propiedades del grupo de conexiones
Descripción de los atributos comunes:
Atributos | ilustrar |
---|---|
Marcar | (En desuso) Proporciona métodos para crear conexiones TCP sin cifrar |
DialContext | Proporciona un método para crear una conexión TCP sin cifrar. Si no se configuran tanto DialContext como Dial, la función de marcado en el paquete de red se usará de forma predeterminada. |
Marcar TLS | (En desuso) Proporciona métodos para crear solicitudes TLS para HTTPS que no sean proxy |
DialTLSContext | Después de proporcionar la configuración del método para crear solicitudes TLS HTTPS sin proxy , las solicitudes HTTPS no usarán las configuraciones relacionadas de DialContext y Dial. Si no se establece DialTLSContext ni DialTLS, las configuraciones de DialContext y TLSClientConfig se usarán de forma predeterminada. |
TLSClientConfig | Especifica la configuración de TLS para usar con |
TLSHhandshakeTimeout | Tiempo de espera de protocolo de enlace de conexión TLS |
Desactivar KeepAlives | Si se establece en verdadero, una conexión solo puede ser utilizada por una solicitud y no puede reutilizarse |
Deshabilitar compresión | Si se establece en verdadero, evita que el transporte solicite compresión con "Aceptar codificación: gzip" |
MaxIdleConns | El número máximo de conexiones inactivas permitidas por todos los hosts |
MaxIdleConnsPerHost | El número máximo de conexiones inactivas permitidas por un solo host, si se establece en 0, use el valor predeterminado de 2 |
MaxConnsPerHost | El número máximo de conexiones permitidas por un solo host, establecer 0 significa ilimitado |
IdleConnTimeout | Tiempo de supervivencia de la conexión, establecer 0 significa ilimitado |
ResponseHeaderTimeoutResponseHeaderTimeout | Encabezado de respuesta que recibe la duración del tiempo de espera, no incluye el cuerpo de la respuesta |
MaxResponseHeaderBytes | Límite máximo de longitud del contenido del encabezado de respuesta, establecer 0 para usar el límite predeterminado |
WriteBufferSize | Especifique el tamaño del búfer de escritura utilizado al escribir la transferencia, configúrelo en 0 y por defecto en 4 KB |
Tamaño del búfer de lectura | Especifica el tamaño del búfer de lectura utilizado al leer de la transferencia, establecido en 0 y predeterminado en 4 KB |
ForceAttemptHTTP2 | verdadero para usar HTTP2 (si se configura el método Dial o DialTLS o DialContext o se proporciona la configuración TLSClientConfig) |
Crear e inicializar un grupo de conexiones
estructura
En la mayoría de los casos, la interfaz que solicitamos debe llevar información de encabezado de solicitud diversa, como cookies.
Almacene la información del encabezado de la solicitud en la instancia de la estructura, y las solicitudes posteriores iniciadas por esta instancia tendrán la misma información del encabezado de la solicitud.
OBTENER método
Si no necesitamos ninguna información de encabezado de solicitud, podemos usar directamente httpClient.Get para solicitar la interfaz.
Si queremos configurar la información del encabezado de solicitud, primero debemos usar http.NewRequest para declarar una solicitud, insertar los datos del encabezado y finalmente ejecutarlo por httpClient. Después de recibir la respuesta, el resultado del procesamiento es que debemos recordar cerrar el flujo de respuesta a tiempo
.
Método POST
Similar al método Get, generalmente pasamos el cuerpo de la solicitud en la solicitud POST. La tramitación del cuerpo de la solicitud es la siguiente:
código completo
package cus_http
import (
"bytes"
"encoding/json"
"io/ioutil"
"net"
"net/http"
"time"
)
// 初始化连接池配置
var httpTrans = &http.Transport{
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
ForceAttemptHTTP2: true,
MaxIdleConns: 100, //所有Host的连接池最大空闲连接数
MaxIdleConnsPerHost: 2, //每个Host的连接池最大空闲连接数
MaxConnsPerHost: 4, //每个Host的连接池最大连接数
IdleConnTimeout: time.Duration(90000) * time.Millisecond, //空闲连接保留时间
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}
// 初始化连接池
var httpClient = &http.Client{
Timeout: 30 * time.Second,
Transport: httpTrans,
}
type CusHttp struct {
Header map[string]string
}
// 发送GET请求
// url: 请求地址
func (cus *CusHttp) Get(url string) string {
// resp, err := httpClient.Get(url)
//初始化请求
reqest, err := http.NewRequest("GET", url, nil)
//增加Header选项
if cus.Header != nil && len(cus.Header) > 0 {
for k, vla := range cus.Header {
reqest.Header.Add(k, vla)
}
}
if err != nil {
panic(err)
}
resp, err := httpClient.Do(reqest)
if err != nil {
panic(err)
}
defer resp.Body.Close()
result, _ := ioutil.ReadAll(resp.Body)
return string(result)
}
// 发送POST请求 默认使用
// url: 请求地址
// data: POST请求提交的数据
func (cus *CusHttp) Post(url string, data interface{
}) string {
return cus.post(url, data)
}
// 发送POST 表单
// url: 请求地址
// data: POST请求提交的数据
func (cus *CusHttp) PostForm(url string, data interface{
}) string {
cus.Header["Content-Type"] = "application/x-www-form-urlencoded"
return cus.post(url, data)
}
// 发送POST请求
// url: 请求地址
// data: POST请求提交的数据
func (cus *CusHttp) post(url string, data interface{
}) string {
jsonStr, _ := json.Marshal(data)
//初始化请求
reqest, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
//增加Header选项
if cus.Header != nil && len(cus.Header) > 0 {
for k, vla := range cus.Header {
reqest.Header.Add(k, vla)
}
}
if err != nil {
panic(err)
}
resp, err := httpClient.Do(reqest)
if err != nil {
panic(err)
}
defer resp.Body.Close()
result, _ := ioutil.ReadAll(resp.Body)
return string(result)
}
prueba
resultado