private final RestTemplate restTemplate;
public RestTemplateService(RestTemplateBuilder builder) {
this.restTemplate = builder.build();
}
RestTemplate builder를 등록 후 .build() 메서드를 호출하면서 RestTemplate를 주입받는다.
Query String 방식으로 server to server로 RestTemplate를 사용
Query String 방식
ex) : http://host:port/path?querystring
query parameters( 물음표 뒤에 = 로 연결된 key value pair 부분)을 url 뒤에 덧붙여서 추가적인 정보를 서버 측에 전달하는 것이다. 클라이언트가 어떤 특정 리소스에 접근하고 싶어하는지 정보를 담는다.
<getForEntity로 하나의 상품을 조회할 때 >
클라이언트 의 컨트롤러
// getCallobject는 get방식으로 URI의 서버에 요청
public ItemDto getCallObject(String query) {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:7070")
.path("/api/server/get-call-obj")
.queryParam("query", query)
.encode()
.build()
.toUri();
log.info("uri = " + uri);
// 생성된 uri 와 응답을 받을 클래스 (ItemDto)를 매개변수로 전달
// ResponseEntity객체로 받는이유 응답의 상태코드, 헤더및 응답본문을 포함하기 때문
ResponseEntity<ItemDto> responseEntity = restTemplate.getForEntity(uri, ItemDto.class);
log.info("statusCode = " + responseEntity.getStatusCode());
// ResponseEntity의 getBody메서드를 사용해서 ItemDto객체로 추출하여 반환
return responseEntity.getBody();
}
서버입장 서버
public Item getCallObject(String query) {
for (Item item : itemList) {
if(item.getTitle().equals(query)) {
return item;
}
}
return null;
}
// 매개변수로 받은 query로 서버에 있는 itemList를 item에 for문으로 돌려 하나하나 조회
// item.getTitle()메서드를 .equals로 비교해서 맞으면 아이템을 리턴
<getForEntity로 여러 상품을 조회할 때 >
public List<ItemDto> getCallList() {
// 요청 URI 만들기
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());
//String타입을 fromJSONtoItems메서드로 리턴
return fromJSONtoItems(responseEntity.getBody());
}
// 하나씩 부를 때와는 다르게 List로 String값 그대로 가지고옴
// getCallObject와는 다르게 .queryParam("query", query) 가 없음
// 이유? 전체를 다가지고 오는 메서드이니까
return fromJSONtoItems(responseEntity.getBody());
코드에서 fromJSONtoItems() 메서드 기능
public List<ItemDto> fromJSONtoItems(String responseEntity) {
// JSONObject 로 변환
JSONObject jsonObject = new JSONObject(responseEntity);
// JSONObject에서 items를 배열로 꺼내서 item에 담기
JSONArray items = jsonObject.getJSONArray("items");
// for문을 items를 하나씩 꺼내서 JSONObject타입으로 변환해서 itemDto에 추가
List<ItemDto> itemDtoList = new ArrayList<>();
for (Object item : items) {
//ItemDto 생성하는 이유?? 질문
ItemDto itemDto = new ItemDto((JSONObject) item);
itemDtoList.add(itemDto);
}
return itemDtoList;
}
Server입장의 서버
itemList를 ItemResponseDto에 담아 반환
public ItemResponseDto getCallList() {
ItemResponseDto responseDto = new ItemResponseDto();
for (Item item : itemList) {
responseDto.setItems(item);
}
return responseDto;
}
package com.sparta.springresttemplateserver.dto;
import com.sparta.springresttemplateserver.entity.Item;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
@Getter
public class ItemResponseDto {
private final List<Item> items = new ArrayList<>();
public void setItems(Item item) {
items.add(item);
}
}
'TIL' 카테고리의 다른 글
+30 Naver Open API (0) | 2023.07.17 |
---|---|
+29 RestTemplate의 exchange (0) | 2023.07.14 |
+27 Spring Security 로그인 (0) | 2023.07.12 |
+26 RestTemplate이란 무엇일까? (0) | 2023.07.11 |
+25 Spring Security : JWT로그인 (0) | 2023.07.09 |