HTTP 통신을 하기 위한 라이브러리 입니다.
리액티브 타입의 송/수신을 하여 Non-Blocking 통신을 지원합니다.
필요할 때 편하게 보기 위해 예제 위주로 기록 합니다.
WebClinet 기본 설정 적용하여 Bean 으로 등록하는 방법
@Configuration
public class WebClientConfig {
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder()
.baseUrl("https://sample.io")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
}
}
GET 요청을 보내는 예시
WebClient webClient = WebClient.create("https://sample.io");
Mono<String> result = webClient.get()
.uri("/info")
.retrieve()
.bodyToMono(String.class);
result.subscribe(System.out::println);
POST 요청을 보내는 예시
WebClient webClient = WebClient.create("https://sample.io");
Mono<String> result = webClient.post()
.uri("/info")
.bodyValue("data")
.retrieve()
.bodyToMono(String.class);
result.subscribe(System.out::println);
에러 처리 예시
WebClient webClient = WebClient.create("https://sample.io");
Mono<String> result = webClient.get()
.uri("/info")
.retrieve()
.bodyToMono(String.class)
.onErrorResume(WebClientResponseException.class,
e -> Mono.just("Error: " + e.getStatusCode()));
result.subscribe(System.out::println);
WebClient builder 주요 옵션
baseUrl(String baseUrl)
: 모든 요청에 사용할 기본 URL을 설정합니다.defaultHeader(String header, String... values)
: 모든 요청에 추가할 기본 헤더를 설정합니다.defaultHeaders(Consumer<HttpHeaders> headersConsumer)
: 모든 요청에 추가할 기본 헤더를 설정합니다.defaultCookie(String cookie, String... values)
: 모든 요청에 추가할 기본 쿠키를 설정합니다.defaultCookies(Consumer<MultiValueMap<String, String>> cookiesConsumer)
: 모든 요청에 추가할 기본 쿠키를 설정합니다.defaultRequest(Consumer<WebClient.RequestHeadersSpec<?>> defaultRequest)
: 모든 요청의 기본값을 설정합니다.filter(ExchangeFilterFunction filterFunction)
: HTTP 요청/응답을 처리하는 필터를 추가합니다.filters(Consumer<List<ExchangeFilterFunction>> filtersConsumer)
: HTTP 요청/응답을 처리하는 필터를 추가합니다
WebMVC 에서 Non-Blocking 통신을 위해 DeferredResult 사용 방법
DeferredResult<String> result = new DeferredResult<>();
Mono<String> mono = webClient.get()
.uri("https://sample.io/info")
.retrieve()
.bodyToMono(String.class);
mono.subscribe(result::setResult);
return result;
WebClient N 개의 요청 처리하는 방법
Mono<String> result1 = webClient.get()
.uri("https://sample.io/info1")
.retrieve()
.bodyToMono(String.class);
Mono<String> result2 = webClient.get()
.uri("https://sample.io/info1")
.retrieve()
.bodyToMono(String.class);
Mono<String> result3 = webClient.get()
.uri("https://sample.io/info1")
.retrieve()
.bodyToMono(String.class);
Mono<Tuple3<String, String, String>> results = Mono.zip(result1, result2, result3);
results.subscribe(tuple -> {
System.out.println(tuple.getT1());
System.out.println(tuple.getT2());
System.out.println(tuple.getT3());
});
특정 ThreadPool 을 이용하여 Webclient 요청을 보내는 방법
ExecutorService executorService = Executors.newFixedThreadPool(10);
Scheduler scheduler = Schedulers.fromExecutor(executorService);
Mono<String> result = webClient.get()
.uri("https://sample.io/info")
.retrieve()
.bodyToMono(String.class)
.subscribeOn(scheduler);
result.subscribe(System.out::println);
댓글
댓글 쓰기