Middleware de Solicitação e Resposta

O Resty oferece a capacidade de usar middleware para interceptar solicitações antes e respostas depois, permitindo o processamento personalizado das operações de solicitação e resposta. Esta abordagem é mais flexível do que as funções de retorno de chamada.

// Crie um cliente Resty
cliente := resty.New()

// Registre o middleware de solicitação
cliente.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error {
    // Agora você pode acessar o cliente e o objeto de solicitação atual
    // Realize as operações conforme necessário

    return nil  // Retorne nil em caso de sucesso, caso contrário retorne um erro
  })

// Registre o middleware de resposta
cliente.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error {
    // Agora você pode acessar o cliente e o objeto de resposta atual
    // Realize as operações conforme necessário

    return nil  // Retorne nil em caso de sucesso, caso contrário retorne um erro
  })

Ganchos de Erro

O Resty fornece um gancho OnError, que pode ser acionado nos casos a seguir:

  • O cliente é incapaz de enviar uma solicitação devido a tempo limite de conexão, falha de handshake TLS, etc.
  • A solicitação foi repetida o número máximo de vezes, mas ainda falha.

Se o servidor responder, o erro original será encapsulado em *resty.ResponseError, que contém a última resposta recebida.

// Crie um cliente Resty
cliente := resty.New()

cliente.OnError(func(req *resty.Request, err error) {
  if v, ok := err.(*resty.ResponseError); ok {
    // v.Response contém a última resposta do servidor
    // v.Err contém o erro original
  }
  // Registre erros, aumente as métricas, etc.
})

Políticas de Redirecionamento

O Resty oferece várias políticas de redirecionamento disponíveis e suporta o uso simultâneo de várias políticas.

// Crie um cliente Resty
cliente := resty.New()

// Defina a política de redirecionamento para o cliente. Crie uma política conforme necessário
cliente.SetRedirectPolicy(resty.FlexibleRedirectPolicy(15))

// Use várias políticas, como contagem de redirecionamento, verificação de domínio, etc.
cliente.SetRedirectPolicy(resty.FlexibleRedirectPolicy(20),
                        resty.DomainCheckRedirectPolicy("host1.com", "host2.org", "host3.net"))

Política de Redirecionamento Personalizada

Implemente a interface RedirectPolicy e registre-a com o cliente Resty. Consulte redirect.go para obter mais informações.

// Crie um cliente Resty
cliente := resty.New()

// Use a função original com resty.SetRedirectPolicy
cliente.SetRedirectPolicy(resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error {
  // Implemente sua lógica aqui

  // Retorne nil para continuar o redirecionamento, ou retorne um erro para interromper/prevenir o redirecionamento
  return nil
}))

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

// Crie uma política de redirecionamento mais flexível usando uma estrutura
type CustomRedirectPolicy struct {
  // Defina variáveis aqui
}

func (c *CustomRedirectPolicy) Apply(req *http.Request, via []*http.Request) error {
  // Implemente sua lógica aqui

  // Retorne nil para continuar o redirecionamento, ou retorne um erro para interromper/prevenir o redirecionamento
  return nil
}

// Registre no resty
cliente.SetRedirectPolicy(CustomRedirectPolicy{/* Inicialize as variáveis */})

Configurações de Proxy

Por padrão, o Go oferece suporte a proxies por meio da variável de ambiente HTTP_PROXY. O Resty fornece suporte a proxy por meio de SetProxy e RemoveProxy. Escolha de acordo com suas necessidades.

As configurações de proxy no nível do cliente serão aplicadas a todas as solicitações.

// Crie um cliente Resty
cliente := resty.New()

// Configure a URL e a porta do proxy
cliente.SetProxy("http://proxyserver:8888")

// Para remover as configurações de proxy
cliente.RemoveProxy()