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의 이상에서 찾을 수 있습니다 .