Cliente HTTP
O RestClient
é uma estrutura em Go que fornece uma interface robusta para fazer requisições HTTP. Ele inclui recursos como circuit breaker, retry de requisições, cache, e suporte para diferentes tipos de requisições HTTP incluindo multipart/form-data.
Estrutura
type RestClient struct {
name string // Nome do cliente REST
baseURL string // URL base para todas as requisições
retries uint8 // Número de tentativas de retry
retrySleep uint // Tempo de espera entre retries (em segundos)
client *http.Client // Cliente HTTP
cb *circuitbreaker.CircuitBreaker // Circuit breaker
}
Configuração
Para criar uma instância do RestClient
, utilize a função NewRestClient
, passando as opções como no exemplo abaixo:
config := &RestClientConfig{
Name: "meu-cliente",
BaseURL: "http://api.exemplo.com",
Timeout: 30,
Retries: 3,
RetrySleepInSeconds: 2,
ProxyURL: "http://proxy.example.com:8080",
}
client := NewRestClient(config)
Principais Funcionalidades
1. Requisições HTTP
O cliente suporta todos os métodos HTTP padrão (GET, POST, PUT, PATCH, DELETE, etc) através da estrutura : Request
// Exemplo de GET
response := Request[MinhaResponseStruct, ErrorStruct]{
Ctx: context.Background(),
Client: client,
HttpMethod: http.MethodGet,
Path: "/usuarios/1",
}.Call()
// Exemplo de POST com corpo
novoUsuario := Usuario{Nome: "João", Email: "joao@exemplo.com"}
response := Request[UsuarioResponse, ErrorResponse]{
Ctx: context.Background(),
Client: client,
HttpMethod: http.MethodPost,
Path: "/usuarios",
Body: &novoUsuario,
}.Call()
2. Upload de Arquivos (Multipart)
Suporte para envio de arquivos usando multipart/form-data
:
arquivo := bytes.NewBufferString("conteúdo do arquivo")
response := Request[RespostaUpload, ErroUpload]{
Ctx: context.Background(),
Client: client,
HttpMethod: http.MethodPost,
Path: "/upload",
MultipartFields: map[string]any{
"arquivo": MultipartFile{
FileName: "documento.txt",
File: arquivo,
ContentType: "text/plain",
},
"descricao": "Meu documento",
},
}.Call()
3. Cache
Suporte para cache nas requisições.
response := Request[DadosUsuario, ErroResponse]{
Ctx: context.Background(),
Client: client,
HttpMethod: http.MethodGet,
Path: "/usuarios/1",
Cache: cacheDB.NewCache[DadosUsuario]("keyName", 10 * time.Second), // cria uma chave com 10s de TTL.
}.Call()
4. Tratamento de Respostas
O cliente fornece uma interface que facilita o tratamento das respostas: ResponseData
.
if response.HasSuccess() {
dados := response.SuccessBody()
// processar dados de sucesso
} else if response.HasError() {
erro := response.ErrorBody()
// tratar erro
}
// Verificar tipo de resposta
if response.IsSuccessfulResponse() {
// Status 2xx
} else if response.IsClientErrorResponse() {
// Status 4xx
} else if response.IsServerErrorResponse() {
// Status 5xx
}
Recursos de Resiliência
Circuit Breaker
O cliente implementa um circuit breaker que:
- Abre após 5 falhas consecutivas
- Permanece aberto por 10 segundos
Retry
Sistema de retry configurável que:
- Permite definir número máximo de tentativas
- Configura tempo de espera entre tentativas
Tipos de Dados
O cliente utiliza interfaces genéricas para dados de requisição e resposta:
RequestData
: Interface para dados de requisição.ResponseSuccessData
: Interface para dados de resposta de sucesso.ResponseErrorData
: Interface para dados de resposta de erro.
Este design permite forte tipagem e flexibilidade ao mesmo tempo.