TIL

+28 RestTemplate Get요청

JAVABOZA 2023. 7. 13. 15:21
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입장의 서버

itemListItemResponseDto에 담아 반환

 

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