저는 를 사용하는 방법에 대해 가장 간단한 사용방법(예제)를 따르려고 노력해 왔으며 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을 얻으려면 어떻게 해야 합니까?
현재 가지고 있는 양식으로 동작을 설명합니다.
WebClient webClient = WebClient.create();
webClient.get()
.uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
.exchange()
.block();
는 block()
를 내부적으로 동기적으로 구독하여 요청을 시작하고 Mono
결과 를 반환합니다 ClientResponse
. 대신 메서드 에서 반환된 를 호출 subscribe()
하여 이를 비동기적으로 처리할 수도 있습니다 .Mono
exchange()
block()
이 현재 형식에서는 이제 성공 상태를 포함하여 개체 block()
의 응답에 대한 모든 메타데이터(즉, 응답 헤더에서)를 갖게 됩니다 . ClientResponse
이는 Response body이 완료되었음을 의미하지 않습니다. 응답 페이로드에 관심이 없다면 성공을 확인하고 그대로 둘 수 있습니다.
Response body을 자세히 보려면 Response body 스트림을 일부 클래스로 변환해야 합니다. 이 시점 에서 응답이 개별 개별 Java 개체로 구문 분석될 수 있는 JSON 배열인 경우와 같이 모든 것을 단일 Mono
with 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()
ClientResponse
exchange()
ClientResponse
retrieve()
block()
WebClient webClient = WebClient.create();
String responseJson = webClient.get()
.uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
.retrieve()
.bodyToMono(String.class)
.block();