Spring/팀스파르타

34. RestTemplate의 Post 요청, exchange

열심히 해 2024. 11. 27. 21:01

Post 요청 방법

 

 

Client 입장 서버

  • 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청합니다.

 

public ItemDto postCall(String query) {
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/post-call/{query}")  // @PathVariable 방식
            .encode()
            .build()
            .expand(query)  // 위 {} 에 들어갈 값을 넣어준다
            .toUri();
    log.info("uri = " + uri);

    User user = new User("Robbie", "1234");
    // Post 방식으로 서버에 요청 진행. 해당 uri(첫 번째 인자)에서 받을 데이터를 받아줄 타입(세 번쨰 인자).
    // server의 server로 보낼 Body (두 번째 인자, RestTemplate에 의해 Json 형태로 변환)
    ResponseEntity<ItemDto> responseEntity = restTemplate.postForEntity(uri, user, ItemDto.class);

    log.info("statusCode = " + responseEntity.getStatusCode());

    return responseEntity.getBody();
}

 

  • UriComponentsBuilder의 expand를 사용하여 {query} 안의 값을 동적으로 처리할 수 있습니다.
  • RestTemplate의 postForEntity는 Post 방식으로 해당 URI의 서버에 요청을 진행합니다.
    • 첫 번째 파라미터에는 URI,
    • 두 번째 파라미터에는 HTTP Body에 넣어줄 데이터를 넣습니다.
      • Java 객체를 두 번째 파라미터에 넣으면 자동으로 JSON 형태로 변환됩니다.
    • 세 번째 파라미터에는 전달 받은 데이터와 매핑하여 인스턴스화할 클래스의 타입을 주면됩니다.

 


 

 

Server 입장 서버

  • Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환합니다.
public Item postCall(String query, UserRequestDto userRequestDto) {
    System.out.println("userRequestDto.getUsername() = " + userRequestDto.getUsername());
    System.out.println("userRequestDto.getPassword() = " + userRequestDto.getPassword());

    return getCallObject(query);
}

 

전달 받은 HTTP Body의 User 데이터를 확인하는 메서드입니다.

 

 


 

exchange

 

RestTemplate으로 요청을 보낼 때 Header에 특정 정보를 같이 전달 하고 싶다면 어떻게 하면 될까요?

 

>> RequestEntity<T>를 사용합니다

 

 

 

Client 입장 서버

  • RestTemplate의 exchange를 사용합니다.
public List<ItemDto> exchangeCall(String token) {
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/exchange-call")
            .encode()
            .build()
            .toUri();
    log.info("uri = " + uri);

    User user = new User("Robbie", "1234");

    RequestEntity<User> requestEntity = RequestEntity
            .post(uri)
            .header("X-Authorization", token)
            .body(user);
    
    ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);

    return fromJSONtoItems(responseEntity.getBody());
}

 

 

Server 입장 서버

  • 전달된 header와 body의 정보를 확인할 수 있습니다.
public ItemResponseDto exchangeCall(String token, UserRequestDto requestDto) {
    System.out.println("token = " + token);
    System.out.println("requestDto.getUsername() = " + requestDto.getUsername());
    System.out.println("requestDto.getPassword() = " + requestDto.getPassword());

    return getCallList();
}