Everyday Dev System

RestTemplate - Post 방식 : Client, Server 코드 설명 본문

내배캠 주요 학습/Spring 숙련

RestTemplate - Post 방식 : Client, Server 코드 설명

chaeyoung- 2023. 6. 20. 16:50

PathVariable 방식 & QueryParam 방식

더보기

PathVariable 방식

위와 같이 expand(query)를 입력하면 query라는 변수가 path에 {query}부분에 들어가서 요청을 보낸다.

URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:7071")
                .path("/api/server/post-call/{query}")
                .encode()
                .build()
                .expand(query)
                .toUri();

서버 프로젝트의 controller 부분

    @PostMapping("/post-call/{query}")
    public Item postCall(@PathVariable String query, @RequestBody UserRequestDto requestDto) {
        return itemService.postCall(query, requestDto);
    }

 

 

 

QueryParam 방식

        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:7071")
                .path("/api/server/get-call-obj")
                .queryParam("query", query)
                .encode()
                .build()
                .toUri();

서버 프로젝트의 controller 부분

    @GetMapping("/get-call-obj")
    public Item getCallObject(@RequestParam String query) {
        return itemService.getCallObject(query);
    }

 

Client service 전체 코드

더보기
package com.sparta.springresttemplateclient1.service;

import com.sparta.springresttemplateclient1.dto.ItemDto;
import com.sparta.springresttemplateclient1.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class RestTemplateService {

    private final RestTemplate restTemplate;

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

    // String query에 맞는 데이터의 ItemDto 타입 반환하기
    public ItemDto getCallObject(String query) {
        // 요청 URL 만들기
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:7071")
                .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();
    }

    // 다 가져오기
    public List<ItemDto> getCallList() {
        // 요청 URL 만들기
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:7071")
                .path("/api/server/get-call-list")
                .encode()
                .build()
                .toUri();
        log.info("uri = " + uri);

        ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
        // Json 형태가 복합적이므로 하나의 클래스로 받을 수 없으므로 String으로 받은 후에 Json으로 다시 변환할거임.

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

        return fromJSONtoItems(responseEntity.getBody());
    }

    public ItemDto postCall(String query) {
        // 요청 URL 만들기
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:7071")
                .path("/api/server/post-call/{query}")
                .encode()
                .build()
                .expand(query)
                .toUri();
        log.info("uri = " + uri);

        User user = new User("Robbie", "1234");

        ResponseEntity<ItemDto> responseEntity = restTemplate.postForEntity(uri, user, ItemDto.class);
        // 두번째 파라미터에는 http body 에 넣어줄 데이터를 넣어야 함.

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

        return responseEntity.getBody();
    }

    public List<ItemDto> exchangeCall(String token) {
        return null;
    }

/*    {
        "items":
        [
                {"title":"Mac","price":3888000},
                {"title":"iPad","price":1230000},
                {"title":"iPhone","price":1550000},
                {"title":"Watch","price":450000},
                {"title":"AirPods","price":350000}
        ]
    }*/

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

 

 

Client service 코드 발췌

public ItemDto postCall(String query) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7071")
            .path("/api/server/post-call/{query}")
            .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();
}

 

1. URI 생성 및 요청

            .path("/api/server/post-call/{query}")
            .encode()
            .build()
            .expand(query)

위와 같이 expand(query)를 입력하면 query라는 변수가 path에 {query}부분에 들어가서 요청을 보낸다.

    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7071")
            .path("/api/server/post-call/{query}")
            .encode()
            .build()
            .expand(query)
            .toUri();

 

restTemplate.postForEntity(uri, 요청시 전달할 데이터, 반환 타입)

클래스 타입을 넣어서 보내도 restTemplate이 자동으로 json 형태로 변환을 해준다.

ResponseEntity<ItemDto> responseEntity = restTemplate.postForEntity(uri, user, ItemDto.class);
        // 두번째 파라미터에는 http body 에 넣어줄 데이터를 넣어야 함.

 

 

 

 

Server project

 

Service 코드 전체보기

더보기
package com.sparta.springresttemplateserver.service;

import com.sparta.springresttemplateserver.dto.ItemResponseDto;
import com.sparta.springresttemplateserver.dto.UserRequestDto;
import com.sparta.springresttemplateserver.entity.Item;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
public class ItemService {

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

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

    public Item postCall(String query, UserRequestDto userRequestDto) {
        System.out.println("userRequestDto.getUsername() = " + userRequestDto.getUsername());
        System.out.println("userRequestDto.getPassword() = " + userRequestDto.getPassword());

        return getCallObject(query);
    }
    
    public ItemResponseDto exchangeCall(String token, UserRequestDto requestDto) {
        return null;
    }
}

 

    public Item postCall(String query, UserRequestDto userRequestDto) {
        System.out.println("userRequestDto.getUsername() = " + userRequestDto.getUsername());
        System.out.println("userRequestDto.getPassword() = " + userRequestDto.getPassword());

        return getCallObject(query);
    }

 

 

결과: 

postman

 

client server

 

server