Middleware de solicitud y respuesta

Resty proporciona la capacidad de utilizar middleware para interceptar las solicitudes antes y las respuestas después, lo que permite el procesamiento personalizado de las operaciones de solicitud y respuesta. Este enfoque es más flexible que las funciones de devolución de llamada.

// Crear un cliente Resty
client := resty.New()

// Registrar middleware de solicitud
client.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error {
    // Ahora puedes acceder al cliente y al objeto de solicitud actual
    // Realizar operaciones según sea necesario

    return nil  // Devuelve nil si es exitoso, de lo contrario devuelve un error
  })

// Registrar middleware de respuesta
client.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error {
    // Ahora puedes acceder al cliente y al objeto de respuesta actual
    // Realizar operaciones según sea necesario

    return nil  // Devuelve nil si es exitoso, de lo contrario devuelve un error
  })

Ganchos de Error

Resty proporciona un gancho OnError, que puede ser llamado en los siguientes casos:

  • El cliente no puede enviar una solicitud debido a un tiempo de espera de conexión, falla en el handshake TLS, etc.
  • La solicitud ha sido intentada el número máximo de veces pero aún falla.

Si el servidor responde, el error original será envuelto en *resty.ResponseError, que contiene la última respuesta recibida.

// Crear un cliente Resty
client := resty.New()

client.OnError(func(req *resty.Request, err error) {
  if v, ok := err.(*resty.ResponseError); ok {
    // v.Response contiene la última respuesta del servidor
    // v.Err contiene el error original
  }
  // Registrar errores, aumentar métricas, etc.
})

Políticas de Redirección

Resty proporciona varias políticas de redirección disponibles y admite el uso simultáneo de múltiples políticas.

// Crear un cliente Resty
client := resty.New()

// Establecer la política de redirección para el cliente. Crear una política según sea necesario
client.SetRedirectPolicy(resty.FlexibleRedirectPolicy(15))

// Usar múltiples políticas, como conteo de redirección, verificación de dominio, etc.
client.SetRedirectPolicy(resty.FlexibleRedirectPolicy(20),
                        resty.DomainCheckRedirectPolicy("host1.com", "host2.org", "host3.net"))

Política de Redirección Personalizada

Implementar la interfaz RedirectPolicy y registrarla con el cliente Resty. Consulta redirect.go para obtener más información.

// Crear un cliente Resty
client := resty.New()

// Utilizar la función original con resty.SetRedirectPolicy
client.SetRedirectPolicy(resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error {
  // Implementa tu lógica aquí

  // Devuelve nil para continuar con la redirección, o devuelve un error para detener/prevenir la redirección
  return nil
}))

//---------------------------------------------------

// Crear una política de redirección más flexible utilizando una estructura
type CustomRedirectPolicy struct {
  // Definir variables aquí
}

func (c *CustomRedirectPolicy) Apply(req *http.Request, via []*http.Request) error {
  // Implementa tu lógica aquí

  // Devuelve nil para continuar con la redirección, o devuelve un error para detener/prevenir la redirección
  return nil
}

// Registrar en resty
client.SetRedirectPolicy(CustomRedirectPolicy{/* Inicializar variables */})

Configuración de Proxy

De forma predeterminada, Go admite proxies a través de la variable de entorno HTTP_PROXY. Resty proporciona soporte para proxy a través de SetProxy y RemoveProxy. Elija según sus necesidades.

La configuración de proxy a nivel de cliente se aplicará a todas las solicitudes.

// Crear un cliente Resty
client := resty.New()

// Establecer la URL y el puerto del proxy
client.SetProxy("http://proxyserver:8888")

// Para eliminar la configuración del proxy
client.RemoveProxy()