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();
}