Filtros Spring WebClient
1. Visão geral
Neste tutorial, vamos explorar filtrosWebClient emSpring WebFlux, uma estrutura da web funcional e reativa.
2. Solicitar filtros
A filter can intercept, examine, and modify a client request (or response). Filtros são muito adequados para adicionar funcionalidade a cada solicitação, já que a lógica permanece em um só lugar. Os casos de uso incluem monitoramento, modificação, criação de log e autenticação de solicitações de clientes, apenas para mencionar algumas.
Uma solicitação tem uma cadeia ordenada de zero ou mais filtros.
No Spring Reactive, os filtros são instâncias da interface funcionalExchangeFilterFunction. A função de filtro tem dois parâmetros: oClientRequest para modificar e o próximoExchangeFilterFunction.
Geralmente, uma função de filtro retorna chamando a próxima na cadeia de filtros:
ExchangeFilterFunction filterFunction = (clientRequest, nextFilter) -> {
LOG.info("WebClient fitler executed");
return nextFilter.exchange(clientRequest);
};
3. WebClient Filtragem
Depois de implementar um filtro de solicitação, temos que “anexá-lo” à instânciaWebClient. Isso só pode ser feito durante a criação deWebClient.
Então, vamos ver como criar umWebClient. A primeira opção é invocarWebClient.create() com ou sem um URL base:
WebClient webClient = WebClient.create();
Isso, infelizmente, não permite adicionar um filtro. A segunda opção, então, é a que estamos procurando.
By using the WebClient.builder() we’re able to add filters:
WebClient webClient = WebClient.builder()
.filter(filterFunction)
.build();
4. Um filtro personalizado
Vamos começar com um filtro que conta as solicitações HTTP GET enviadas pelo cliente.
O filtro examina o método de solicitação e aumenta um contador "global" no caso de uma solicitação GET:
ExchangeFilterFunction countingFunction = (clientRequest, nextFilter) -> {
HttpMethod httpMethod = clientRequest.method();
if (httpMethod == HttpMethod.GET) {
getCounter.incrementAndGet();
}
return nextFilter.exchange(clientRequest);
};
O segundo filtro que definiremos anexa um número de versão ao caminho do URL de solicitação. Utilizamos o métodoClientRequest.from() para criar um novo objeto de solicitação a partir do atual e definir a URL modificada.
Posteriormente, continuamos executando a cadeia de filtros com o novo objeto de solicitação modificado:
ExchangeFilterFunction urlModifyingFilter = (clientRequest, nextFilter) -> {
String oldUrl = clientRequest.url().toString();
URI newUrl = URI.create(oldUrl + "/" + version);
ClientRequest filteredRequest = ClientRequest.from(clientRequest)
.url(newUrl)
.build();
return nextFilter.exchange(filteredRequest);
};
A seguir, vamos definir um filtro para registrar os métodos de solicitações enviadas junto com seus URLs. Esses detalhes estão disponíveis no objeto de solicitação.
Tudo o que precisamos fazer é imprimir em algum fluxo de saída:
ExchangeFilterFunction loggingFilter = (clientRequest, nextFilter) -> {
printStream.print("Sending request " + clientRequest.method() + " " + clientRequest.url());
return nextFilter.exchange(clientRequest);
};
5. Um filtro padrão
Finalmente,let’s look into basic authentication - um caso de uso muito comum de filtragem de solicitação.
A classe auxiliarExchangeFilterFunctions oferece a função de filtrobasicAuthentication() que se encarrega de adicionar o cabeçalhoauthorization à solicitação.
Como resultado, não precisamos definir um filtro para ele:
WebClient webClient = WebClient.builder()
.filter(ExchangeFilterFunctions.basicAuthentication(user, password))
.build();
6. Conclusão
Neste pequeno artigo, exploramos a filtragem de clientes WebFlux no Spring.
Como sempre, o exemplo de código pode ser encontrado emover on GitHub.