개발/reactive

[webclient] 비슷한데 뭘 써야할지 모르겠는 것들

방푸린 2022. 4. 1. 18:12
반응형
  • retrieve vs exchange(exchangeToMono)

retrieve: http status code가 200일 경우 response body처리
http status code가 다른 경우(400, 500, etc.) WebClientResponseException 떨어짐
에러 처리 커스텀하게 하고 싶으면 onStatus 사용

exchange: any response에서도 사용 가능하나 꼭 response 내용을 사용해야 함(성공이건 실패건 상관없이) 아니면 memory leak이 있을 수 있다고..

응답이 200이고 응답 body에 대한 처리만 하고 싶은 경우 retrieve.
이 외에 응답 코드가 4xx, 5xx 등 특정 코드에 따라 다른 결과를 주고 싶거나 응답 헤더를 사용하고 싶은 경우는 exchange를 사용


  • 에러 처리할 때 doOnNext vs flatMap?

둘 다 작동하긴 하지만 함수의 사상 상 doOnNext가 더 적합한 것 같다. 둘 다 두면 위에서 걸려서 아래로 안 흐른다.

public Mono<BaseResponse<String>> getPopo(){
    System.out.println(">> popo " + Thread.currentThread().getName());
    return webClient.get()
            .uri(uriBuilder -> uriBuilder.path("/api/hello/popo").build())
            .retrieve()
            .onStatus(HttpStatus::isError, resp -> Mono.error(new Exception()))
            .subscribeOn(Schedulers.boundedElastic())
           .bodyToMono(new ParameterizedTypeReference<BaseResponse<String>>(){})
//                .doOnNext(res -> {
//                    if(res.getHeader().getStatus() == 200){
//                        throw new Exception("error");
//                    }
//                })
         
            .flatMap(res -> {
                if(res.getHeader().getStatus() == 300){
                    return Mono.error(new Exception("검증실패"));
                    //return Mono.empty();
                }else{
                    System.out.println(">> popo2 " + Thread.currentThread().getName());
                    return Mono.just(res);
                }
            })
            .delayElement(Duration.ofSeconds(10))
            ;

}

 


참고: https://binux.tistory.com/56

 

[Spring Reactive] WebClient

Web Reactive Stack 공식문서의 WebClient 부분을 읽고 해석하며 작성했습니다. Web on Reactive Stack The original web framework included in the Spring Framework, Spring Web MVC, was purpose-built for th..

binux.tistory.com

 

728x90
반응형