Spring

Spring 숙련 12 (RestTemplate의 Get)

sehunbang 2024. 1. 27. 22:32

RestTemplate의 Get 요청

Get 요청 방법

 

클라이언트 입장.

1. Client 입장 서버 에서 

RestTemplate을 주입 받습니다. (Service)

 

RestTemplate  을 만들수 있는 RestTemplateBuilder 사용

UrI 로 uri 만들기

 

2. 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청합니다.

 

URI uri = UriComponentsBuilder .fromUriString("http://localhost:7070"

.path("/api/server/get-call-obj"

.queryParam("query", query

.encode() 

.build() 

.toUri();

 

public class RestTemplateService {
    private final RestTemplate restTemplate;

    public RestTemplateService(RestTemplateBuilder builder){
        this.restTemplate = builder.build();
    }

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

 

Spring의 UriComponentsBuilder를 사용해서 URI를 손쉽게 만들 수 있습니다.

RestTemplate의 getForEntity는 Get 방식으로 해당 URI의 서버에 요청을 진행합니다.

첫 번째 파라미터에는 URI,

두 번째 파라미터에는 전달 받은 데이터와 매핑하여 인스턴스화할 클래스의 타입을 주면됩니다.

 

요청의 결과값에 대해서 직접 JSON TO Object를 구현할 필요없이 RestTemplate을 사용하면 자동으로 처리 해줍니다

 

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

 

 

Server 입장 서버

1. Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환합니다.

private final List<Item> itemList = Arrays.asList(
        new Item("Mac", 3_888_000),
        new Item("iPad", 1_230_000),
        new Item("iPhone", 1_550_000),
        new Item("Watch", 450_000),
        new Item("AirPods", 350_000)
);
public Item getCallObject(String query) {
    for (Item item : itemList) {
        if(item.getTitle().equals(query)) {
            return item;
        }
    }
    return null;
}

 

요청한 Item이 여러 개라면?

Client 입장 서버

build.gradle : json

dependencies {
    implementation 'org.json:json:20230227'

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

 

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

 

Server 입장 서버

 

dependencies {
    implementation 'org.json:json:20230227'

추가

 

Item Service

public ItemResponseDto getCallList() {
    ItemResponseDto responseDto = new ItemResponseDto();
    for (Item item : itemList) {
        responseDto.setItems(item);
    }
    return responseDto;
}