개발/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
반응형