Filtros Spring WebClient

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.