Part3 - CH7. REST Template(2) POST
REST Template (2)
이번 시간에서는 REST Template을 활용하여 POST요청을 보내고 받는것을 실습한다.
일단 클라이언트에서 postFor~~ 를 활용해서 요청해보자.
일단 Post를 보내기 위한 dto를 생성하자.
@Data
public class UserRequest {
private String name;
private int age;
}
dto와 UriBuilder를 활용하여 post를 보내는 서비스를 생성한 후,
public UserResponse post(){
//http://localhost:9091/api/server/user/{userId}/name/{userName}
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9091")
.path("/api/server/user/{userId}/name/{userName}")
.encode()
.buildAndExpand(100, "dboo") //userId, userName
// .build().expand() 따로 해줘도 무방
.toUri();
// http body -> object -> object mapper -> JSON -> rest template -> http body json
UserRequest req = new UserRequest();
req.setName("dboo");
req.setAge(31);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserResponse> response = restTemplate.postForEntity(uri, req, UserResponse.class);
log.info("{}", response.getStatusCode());
log.info("{}", response.getHeaders());
log.info("{}", response.getBody());
return response.getBody();
}
컨트롤러에서 post()를 호출하도록 변경해주자.
@PostMapping("")
public UserResponse postHello(){
return restTemplateService.post();
}
그리고 post를 받는 서버쪽 컨트롤러를 만들자.
@PostMapping("/user/{userId}/name/{userName}")
public User post(@RequestBody User user, @PathVariable int userId, @PathVariable String userName){
log.info("PathVariable => userId : {}, userName : {}", userId, userName);
log.info("client req => user객체 : {}", user);
return user;
}
응답로그를 찍어보면 Keep-Alive:”timeout=60”, Connection:”keep-alive” 와 같이 되어있는 부분을 나중에 다룬겠다.
서버가 응답을 어떤 타입의 값으로 내려줄지 모를때에는 String타입으로 일단 받아서 보는것도 하나의 전략이다.