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타입으로 일단 받아서 보는것도 하나의 전략이다.