개인 공부용 정리중.
WebClient는 결국 서버와의 통신을 위한 목적이므로 다음과 같은 과정이 필요하겠다.
1. 서버에 요청할 때 사용할 요청 포멧을 정의함 (당연히, 서버와 동일한 포멧으로 주고 받아야함)
2. 서버로 부터 응답 받을 데이터 포멧을 정의함
3. 서버로 부터 응답 받은 데이터를 처리함
1. 요청 포멧 정의하기.
예를 들어 서버가 다음과 같은 데이터 포멧을 수신하도록 만들어져 있다면
@Data
@RequiredArgsConstructor
public class Pet {
final private String name;
final private int age;
final private Date createdDate;
}
@Slf4j
@RestController
@RequestMapping("/myservice")
public class WebClientExampleController {
@PostMapping(value="/pet",
consumes = { MediaType.APPLICATION_JSON_VALUE},
produces = { MediaType.APPLICATION_JSON_VALUE}
)
public Pet requestParam(@RequestBody Pet pet) {
pet.setCreatedDate(new Date());
log.info("{} is created ", pet.getName());
return pet;
}
}
Rest Client UI를 이용하여 요청해보면 포멧이 아래와 같다.
POST /myservice/pet HTTP/1.1
HOST: localhost:8080
content-type: application/json
content-length: 27
{"name":"byeol","age":"16"}
1.1) Pet 객체를 담고 Json문자열로 변환하기
더보기
WebClient webClient = WebClient.builder().defaultHeader(HttpHeaders.USER_AGENT, "Spring 5 WebClient")
.defaultHeader(HttpHeaders.CONTENT_TYPE, "application/json").build();
Pet pet = new Pet();
pet.setName("byeol");
pet.setAge(16);
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(pet);
String URL = "http://localhost:8080/myservice/pet";
1.2) Json 을 요청에 담아서 요청 하기
webClient
.post() //POST
.uri(URL) //요청 URL
.accept(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(jsonString)) //요청 Body
2. 응답 받을 데이터 포멧 정의하기
retrieve() 호출하여 응답 받을 데이터 포멧을 정의할 수 있다.
retrieve 함수 리턴 타입은 ResponseSpec으로 bodyToMono, bodyToFlux와 같은 데이터를 변환할 수 있는 함수를 가지고 있음
예를 들어 Pet.class 유형 (Json)으로 전달 받기 위해서는 bodyToMono(Pet.class) 호출한다.
webClient
.post() //POST
.uri(URL) //요청 URL
.body(BodyInserters.fromValue(jsonString)) //요청 Body
.retrieve()
.bodyToMono(Pet.class)
3. 응답 데이터 처리하기
비동기적으로 응답 데이터를 가져오기 위해서는 subscribe 함수를 호출해야한다.
그리고 응답을 받았을 때 처리해야하는 로직을 subscribe에 정의하면 된다.
(동기 호출인 경우 block()을 사용하자)
webClient
.post() //POST
.uri(URL) //요청 URL
.body(BodyInserters.fromValue(jsonString)) //요청 Body
.retrieve()
.bodyToMono(Pet.class).subscribe(ss -> log.info("result is {}", ss));
결과
result is Pet(name=byeol, age=16, createdDate=Fri Dec 04 12:16:16 KST 2020)