RestTemplate의 Get 요청

금은체리·2023년 11월 17일
0

Spring

목록 보기
24/49

Get 요청 방법

Client 입장 서버

  1. RestTemplate를 주입 받음
private final RestTemplate restTemplate;

// RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성합니다.
public RestTemplateService(RestTemplateBuilder builder) {
    this.restTemplate = builder.build();
}
  1. 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청
public ItemDto getCallObject(String query) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/get-call-obj")
            .queryParam("query", query)
            .encode()
            .build()
            .toUri();
    log.info("uri = " + uri);

    ResponseEntity<ItemDto> responseEntity = restTemplate.getForEntity(uri, ItemDto.class);

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

    return responseEntity.getBody();
}

  • Query String

  • Spring의 UriComponentsBuilder를 사용해서 URI를 손쉽게 만들 수 있음

  • restTemplate.getForEntity(URI, 전달 받은 데이터와 매핑하여 인스턴스화 할 클래스의 타입)

    • Get 방식으로 해당 URI의 서버에 요청 진행
  • 요청의 결과값에 대해서 직접 JSON TO Object를 구현할 필요 없이 RestTemplate을 사용하면 자동으로 처리 해줌

    • 따라서 response.getBody() 를 사용하여 두 번째 파라미터로 전달한 클래스 타입으로 자동 변환된 객체를 가져올 수 있음

Server 입장 서버

  1. Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환
public Item getCallObject(String query) {
    for (Item item : itemList) {
        if(item.getTitle().equals(query)) {
            return item;
        }
    }
    return null;
}

요청한 Item이 여러 개라면?

Client 입장 서버

  1. Item List 조회
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());
}
  • 결과 값이 다중 JSON으로 넘어오기 때문에 JSON To Object를 사용하지 않고 일단 String 값 그대로 가져옴

    • Server 입장 서버의 ItemResponseDto는 아래의 JSON 형태로 변환되어 전달됨

    • JSON 처리를 도와주는 라이브러리를 추가하여 받아온 JSON 형태의 String을 처리

      public List<ItemDto> fromJSONtoItems(String responseEntity) {
          JSONObject jsonObject = new JSONObject(responseEntity);
          JSONArray items  = jsonObject.getJSONArray("items");
          List<ItemDto> itemDtoList = new ArrayList<>();
      
          for (Object item : items) {
              ItemDto itemDto = new ItemDto((JSONObject) item);
              itemDtoList.add(itemDto);
          }
      
          return itemDtoList;
      }
  • JSONObject, JSONArray 이해하기
    1. 문자열 정보를 JSONObject로 바꾸기

      JSONObject jsonObject = new JSONObject(responseEntity);
    2. JSONObject에서 items 배열 꺼내기

      JSONArray items  = jsonObject.getJSONArray("items");
    3. JSONArray로 for문 돌면서 상품 하나씩 ItemDto로 변환하기

      List<ItemDto> itemDtoList = new ArrayList<>();
      
      for (Object item : items) {
          ItemDto itemDto = new ItemDto((JSONObject) item);
          itemDtoList.add(itemDto);
      }
    4. JSONObject에서 ItemDto로 변환하기

      this.title = itemJson.getString("title");
      this.price = itemJson.getInt("price");
  • ItemDto에 받아온 JSONObject를 사용하여 초기화하는 생성자 추가

    @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");
        }
    }

Server 입장의 서버

  1. Server 입장의 서버에서 itemList를 ItemResponseDto에 담아 반환
    public ItemResponseDto getCallList() {
        ItemResponseDto responseDto = new ItemResponseDto();
        for (Item item : itemList) {
            responseDto.setItems(item);
        }
        return responseDto;
    }
profile
전 체리 알러지가 있어요!

0개의 댓글