RestTemplate 요청 방법

김나영·2023년 7월 3일
0

Spring

목록 보기
27/38

1. GET 요청 방법

Client 입장 서버

1) RestTemplate을 주입 받음

  • RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성
private final RestTemplate restTemplate;
// RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성
public RestTemplateService(RestTemplateBuilder builder) {
    this.restTemplate = builder.build();
}

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

    public ItemDto getCallObject(String query) {
        // 요청 URL 만들기
        URI uri = UriComponentsBuilder // Uri라는 class 객체 생성 가능
                .fromUriString("http://localhost:7070")
                .path("/api/server/get-call-obj") // 서버 입장의 서버 Controller 부분에 존재
                .queryParam("query", query) // path 주고 ? 데이터 Controller에서 받아온 query를 넣어주면 됨
                .encode()
                .build()
                .toUri();
        log.info("uri = " + uri);
        ResponseEntity<ItemDto> responseEntity = restTemplate.getForEntity(uri, ItemDto.class);
        // getForEntity : Get 방식으로 해당 URL의 요청 진행
        // ItemDto.class : 서버 입장의 서버(ItemController)에 요청을 한 다음 해당하는 데이터(Item)를 ItemDto로 받음(Class 타입으로 지정)
        // --> 자동으로 Deserialize(역직렬화)가 되어서 객체 형태로 담김
        // ResponseEntity 타입으로 받음 , ItemDto로 받을 거기 때문에 Generic 타입은 ItemDto
        log.info("statusCode = " + responseEntity.getStatusCode());
        return responseEntity.getBody();
    }
  • RestTemplate의 getForEntity는 Get 방식으로 해당 URI의 서버에 요청을 진행

    • 첫 번째 파라미터 : URI

      • UriComponentsBuilder를 사용해서 URL 생성
    • 두 번째 파라미터 : 전달 받을 데이터 클래스의 타입

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

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

3) 요청한 Item이 여러 개라면?

  • 결과 값이 다중 JSON으로 넘어오기 때문에 JSON To Object를 사용하지 않고 일단 String 값 그대로 가져옴
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());
}
  • Server 입장의 서버의 ItemResponseDto는 JSON 형태로 변환되어 전달됨
implementation 'org.json:json:20230227'
  • JSON 처리를 도와주는 라이브러리를 추가하여 받아온 JSON 형태의 String을 처리
    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); // 여러 개를 받기 때문에 String
        log.info("statusCode = " + responseEntity.getStatusCode());
        log.info("Body = " + responseEntity.getBody());
        return fromJSONtoItems(responseEntity.getBody());
    }
  • 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를 조회하여 요청받은 검색어에 맞는 Item을 반환

public Item getCallObject(String query) {
    for (Item item : itemList) {
        if(item.getTitle().equals(query)) {
            return item;
        }
    }
    return null;
}

1-1) ItemList 반환

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

2. POST 요청 방법

Client 입장 서버

1) 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청

public ItemDto postCall(String query) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/post-call/{query}") // PathVariable 방식
            .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();
}
  • UriComponentsBuilder의 expand를 사용하여 {query} 안의 값을 동적으로 처리할 수 있음

  • RestTemplate의 postForEntity : Post 방식으로 해당 URI의 서버에 요청

    • 첫 번째 파라미터 : URI

    • 두 번째 파라미터 : HTTP Body에 넣어줄 데이터

      • 자동으로 JSON 형태로 변환됨
    • 세 번째 파라미터 : 전달 받은 데이터와 매핑하여 인스턴스화할 클래스의 타입

Server 입장 서버

  • Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 item 반환
public Item postCall(String query, UserRequestDto userRequestDto) {
    System.out.println("userRequestDto.getUsername() = " + userRequestDto.getUsername());
    System.out.println("userRequestDto.getPassword() = " + userRequestDto.getPassword());
    return getCallObject(query);
}
  • 전달 받은 HTTP Body의 User 데이터 확인

0개의 댓글