()
를 사용하여 RestTemplate을 생성private final RestTemplate restTemplate;
// RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성
public RestTemplateService(RestTemplateBuilder builder) {
this.restTemplate = builder.build();
}
public ItemDto getCallObject(String query) {
// 요청 URL 만들기
URI uri = UriComponentsBuilder // Uri라는 class 객체 생성 가능
.fromUriString("http://localhost:7070")
.path("/api/server/get-call-obj") // 서버 입장의 서버 Controller 부분에 존재
.queryParam("query", query) // path 주고 ? 데이터 Controller에서 받아온 query를 넣어주면 됨
.encode()
.build()
.toUri();
log.info("uri = " + uri);
ResponseEntity<ItemDto> responseEntity = restTemplate.getForEntity(uri, ItemDto.class);
// getForEntity : Get 방식으로 해당 URL의 요청 진행
// ItemDto.class : 서버 입장의 서버(ItemController)에 요청을 한 다음 해당하는 데이터(Item)를 ItemDto로 받음(Class 타입으로 지정)
// --> 자동으로 Deserialize(역직렬화)가 되어서 객체 형태로 담김
// ResponseEntity 타입으로 받음 , ItemDto로 받을 거기 때문에 Generic 타입은 ItemDto
log.info("statusCode = " + responseEntity.getStatusCode());
return responseEntity.getBody();
}
RestTemplate의 getForEntity는 Get 방식으로 해당 URI의 서버에 요청을 진행
첫 번째 파라미터 : URI
두 번째 파라미터 : 전달 받을 데이터 클래스의 타입
요청의 결과값에 대해 직접 JSON TO Object를 구현할 필요없이 RestTemplate을 사용하면 자동으로 처리해줌
()
를 사용하여 두 번째 파라미터로 전달한 클래스 타입으로 자동 변환된 객체를 가져올 수 있음public List<ItemDto> getCallList() {
// 요청 URL 만들기
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:7070")
.path("/api/server/get-call-list")
.encode()
.build()
.toUri();
log.info("uri = " + uri);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
log.info("statusCode = " + responseEntity.getStatusCode());
log.info("Body = " + responseEntity.getBody());
return fromJSONtoItems(responseEntity.getBody());
}
implementation 'org.json:json:20230227'
public List<ItemDto> getCallList() {
// 요청 URL 만들기
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:7070")
.path("/api/server/get-call-list")
.encode()
.build()
.toUri();
log.info("uri = " + uri);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class); // 여러 개를 받기 때문에 String
log.info("statusCode = " + responseEntity.getStatusCode());
log.info("Body = " + responseEntity.getBody());
return fromJSONtoItems(responseEntity.getBody());
}
@Getter
@NoArgsConstructor
public class ItemDto {
private String title;
private int price;
public ItemDto(JSONObject itemJson) {
this.title = itemJson.getString("title");
this.price = itemJson.getInt("price");
}
}
public Item getCallObject(String query) {
for (Item item : itemList) {
if(item.getTitle().equals(query)) {
return item;
}
}
return null;
}
public ItemResponseDto getCallList() {
ItemResponseDto responseDto = new ItemResponseDto();
for (Item item : itemList) {
responseDto.setItems(item);
}
return responseDto;
}
public ItemDto postCall(String query) {
// 요청 URL 만들기
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");
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에 넣어줄 데이터
세 번째 파라미터 : 전달 받은 데이터와 매핑하여 인스턴스화할 클래스의 타입
public Item postCall(String query, UserRequestDto userRequestDto) {
System.out.println("userRequestDto.getUsername() = " + userRequestDto.getUsername());
System.out.println("userRequestDto.getPassword() = " + userRequestDto.getPassword());
return getCallObject(query);
}