Spring

Spring WebClient에서 응답 json을 얻는 방법

기록만이살길 2022. 12. 6. 01:48
반응형

Spring WebClient에서 응답 json을 얻는 방법

1. 질문(문제점):

저는 를 사용하는 방법에 대해 가장 간단한 사용방법(예제)를 따르려고 노력해 왔으며 WebClient, 에 비해 다음으로 가장 훌륭한 것으로 알고 있습니다 RestTemplate.

예: https://www.baeldung.com/spring-5-webclient#4-getting-a-response

여기에 이미지 설명 입력

그래서 일부 json을 반환해야 하는 https://petstore.swagger.io/v2/pet/findByStatus?status=available 로 동일한 작업을 수행하려고 할 때 ,

WebClient webClient = WebClient.create();
webClient.get().uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available").exchange().block();

여기에 이미지 설명 입력

DefaultClientResponse결과 개체 에서 진행하는 방법을 전혀 모릅니다 . 물리적 Response body에 도달하는 것이 이렇게 복잡해서는 안 되지만 여기서는 빗나갑니다.

내가 제공한 코드로 Response body을 얻으려면 어떻게 해야 합니까?

2. 해결방안:

현재 가지고 있는 양식으로 동작을 설명합니다.

WebClient webClient = WebClient.create();
webClient.get()
         .uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
         .exchange()
         .block();

block()를 내부적으로 동기적으로 구독하여 요청을 시작하고 Mono결과 를 반환합니다 ClientResponse. 대신 메서드 에서 반환된 를 호출 subscribe()하여 이를 비동기적으로 처리할 수도 있습니다 .Monoexchange()block()

이 현재 형식에서는 이제 성공 상태를 포함하여 개체 block()의 응답에 대한 모든 메타데이터(즉, 응답 헤더에서)를 갖게 됩니다 . ClientResponse이는 Response body이 완료되었음을 의미하지 않습니다. 응답 페이로드에 관심이 없다면 성공을 확인하고 그대로 둘 수 있습니다.

Response body을 자세히 보려면 ​​Response body 스트림을 일부 클래스로 변환해야 합니다. 이 시점 에서 응답이 개별 개별 Java 개체로 구문 분석될 수 있는 JSON 배열인 경우와 같이 모든 것을 단일 Monowith bodyToMono또는 개체 스트림( Flux) 으로 읽을지 여부를 결정할 수 있습니다.bodyToFlux

그러나 귀하의 경우 JSON을 있는 그대로 보고 싶을 뿐입니다. 따라서 a로 변환하면 String충분합니다. 객체 bodyToMono를 반환하는 것을 사용 하면 됩니다.Mono

WebClient webClient = WebClient.create();
String responseJson = webClient.get()
                               .uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
                               .exchange()
                               .block()
                               .bodyToMono(String.class)
                               .block();

여기 block()에서 응답 페이로드가 도착하고 로 구문 분석될 때까지 기다리는 데 사용 String하지만 완료되면 반응적으로 수신하도록 subscribe할 수도 있습니다.Mono

한 가지 주의할 점은 바로가기 retrieve()대신 사용할 수 있다는 것입니다 . 이 경우 기본 동작이 오류 응답을 처리하도록 합니다. 의 오류 응답에 대한 응답에 대한 모든 책임 은 애플리케이션에 있습니다. 자세한 내용 은 Javadoc을 참조하십시오 . 버전은 다음과 같습니다 . 응답 데이터에만 신경 쓸 필요가 없습니다 .exchange()ClientResponseexchange()ClientResponseretrieve()block()

WebClient webClient = WebClient.create();
String responseJson = webClient.get()
                               .uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
                               .retrieve()
                               .bodyToMono(String.class)
                               .block();
반응형