Golang envía una solicitud HTTP

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

Crear un grupo de conexiones

Inicializar las propiedades del grupo de conexiones

inserte la descripción de la imagen aquí
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

inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

OBTENER método

Si no necesitamos ninguna información de encabezado de solicitud, podemos usar directamente httpClient.Get para solicitar la interfaz.
inserte la descripción de la imagen aquí
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
inserte la descripción de la imagen aquí
.
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí

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

inserte la descripción de la imagen aquí
resultado
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_40096897/article/details/128920003
Recomendado
Clasificación