1. 개요

이 예제에서는 기능적이고 반응적인 웹 프레임워크인 Spring WebFlux 에서 WebClient 필터 를 탐색할 것입니다.

2. 요청 필터

필터는 클라이언트 요청(또는 응답)을 가로채고 검사하고 수정할 수 있습니다. 필터는 논리가 한 곳에 유지되기 때문에 모든 단일 요청에 기능을 추가하는 데 매우 적합합니다. 사용 사례에는 몇 가지만 언급하자면 클라이언트 요청 모니터링, 수정, 로깅 및 인증이 포함됩니다.

요청에는 순서가 지정된 0개 이상의 필터 체인이 있습니다.

Spring Reactive에서 필터는 기능 인터페이스 ExchangeFilterFunction 의 인스턴스입니다 . 필터 함수에는 수정할 ClientRequest 와 다음 ExchangeFilterFunction 이라는 두 개의 매개변수가 있습니다.

일반적으로 필터 함수는 필터 체인에서 다음 함수를 호출하여 반환합니다.

ExchangeFilterFunction filterFunction = (clientRequest, nextFilter) -> {
    LOG.info("WebClient fitler executed");
    return nextFilter.exchange(clientRequest);
};

3. 웹클라이언트 필터링

요청 필터를 구현한 후 WebClient 인스턴스에 "연결"해야 합니다. 이는 WebClient 를 생성하는 동안에만 수행할 수 있습니다 .

그럼 WebClient 를 생성하는 방법을 알아보겠습니다 . 첫 번째 옵션은 기본 URL을 사용하거나 사용하지 않고 WebClient.create() 를 호출 하는 것입니다.

WebClient webClient = WebClient.create();

안타깝게도 필터를 추가할 수 없습니다. 두 번째 옵션은 우리가 찾고 있는 옵션입니다.

WebClient.builder() 를 사용하여 필터를 추가할 수 있습니다 .

WebClient webClient = WebClient.builder()
  .filter(filterFunction)
  .build();

4. 사용자 지정 필터

클라이언트가 보낸 HTTP GET 요청을 계산하는 필터부터 시작하겠습니다.

필터는 요청 방법을 검사하고 GET 요청의 경우 "전역" 카운터를 증가시킵니다.

ExchangeFilterFunction countingFunction = (clientRequest, nextFilter) -> {
    HttpMethod httpMethod = clientRequest.method();
    if (httpMethod == HttpMethod.GET) {
        getCounter.incrementAndGet();
    }
    return nextFilter.exchange(clientRequest);
};

우리가 정의할 두 번째 필터는 요청 URL 경로에 버전 번호를 추가합니다. ClientRequest.from() 메서드를 사용 하여 현재 요청 객체에서 새 요청 객체를 생성하고 수정된 URL을 설정합니다.

그 후, 수정된 새 요청 객체로 필터 체인을 계속 실행합니다.

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);
};

다음으로 URL과 함께 보낸 요청의 메서드를 기록하는 필터를 정의해 보겠습니다. 이러한 세부 정보는 요청 개체에서 사용할 수 있습니다.

우리가 해야 할 일은 일부 출력 스트림에 인쇄하는 것입니다.

ExchangeFilterFunction loggingFilter = (clientRequest, nextFilter) -> {
    printStream.print("Sending request " + clientRequest.method() + " " + clientRequest.url());
    return nextFilter.exchange(clientRequest);
};

5. 표준 필터

마지막으로 요청 필터링의 매우 일반적인 사용 사례인 기본 인증을 살펴보겠습니다 .

도우미 클래스인 ExchangeFilterFunctions인증 헤더를 요청 에 추가하는 것을 처리하는 basicAuthentication() 필터 함수를 제공합니다.

결과적으로 필터를 정의할 필요가 없습니다.

WebClient webClient = WebClient.builder()
  .filter(ExchangeFilterFunctions.basicAuthentication(user, password))
  .build();

6. 결론

이 짧은 기사에서는 Spring에서 WebFlux 클라이언트 필터링을 살펴보았습니다.

항상 그렇듯이 코드 예제는 GitHub의 이상에서 찾을 수 있습니다 .

HTTPClient footer