Rest Client

귀찮Lee·2022년 8월 21일
0

Spring

목록 보기
30/30
post-custom-banner

◎ Rest Client

  • Rest API 서버에 HTTP 요청을 보낼 수 있는 클라이언트 툴 또는 라이브러리

  • 목적

    • 서버도 다른 서버로부터 리소스를 제공 받아야 하는 경우가 굉장히 많음
    • 따라서 다른 서버로 HTTP 요청을 보내 정보를 받아야 할 필요성이 생김

◎ RestTemplete

  • RestTemplate

    • Spring에서 HTTP Client 라이브러리 중 하나를 이용해서 원격지에 있는 다른 Backend 서버에 HTTP 요청을 보낼 수 있는 Rest Client API
    • Rest 엔드 포인트 지정, 헤더 설정, 파라미터 및 body 설정을 한 줄의 코드로 손쉽게 전송 가능
  • Template의 의미

    • PPT 템플릿처럼 HTTP Client 라이브러리 중 하나를 유연하게 사용하게 도와주는 템플릿
  • RestTemplate 이용하는 서비스 예시

    • 결제 서비스 : 결제 서비스를 지원해주는 PG(Payment Gateway)사와의 API 통신
    • 메시징 기능 : 주문한 커피가 나올 경우 등 카카오톡 같은 메시지로 고객에게 메시지 알림을 전송

◎ RestTemplete 예시

  • 의존 라이브러리 추가

    dependencies {
        ...
        ...
        implementation 'org.apache.httpcomponents:httpclient'
    }
  • RestTemplete 적용 (객체 생성, URI 생성)

    public class RestClientExample01 {
        public static void main(String[] args) {
            // (1) 객체 생성
            RestTemplate restTemplate =
                    new RestTemplate(new HttpComponentsClientHttpRequestFactory());
    
            // (2) URI 생성
            UriComponents uriComponents =
                    UriComponentsBuilder
                            .newInstance()
                            .scheme("http")
                            .host("worldtimeapi.org")
    //                        .port(80)
                            .path("/api/timezone/{continents}/{city}")
                            .encode()
                            .build();
            URI uri = uriComponents.expand("Asia", "Seoul").toUri();
  • URI 생성 - UriComponents

    • newInstance() : UriComponentsBuilder 객체를 생성합니다.
    • scheme("http") : URI의 scheme을 설정
    • host() : 호스트 정보를 입력
    • port() : 포트 정보 입력 (Default : 80)
    • path()
      • URI의 경로(path)를 입력
      • 템플릿 변수를 사용 가능, URI 에서 expand()로 추가
    • encode()
      • URI에 사용된 템플릿 변수들을 인코딩
      • non-ASCII 문자와 URI에 적절하지 않은 문자를 Percent Encoding
    • build() : UriComponents 객체를 생성
  • URI 생성 - URI

    • expand() : 파라미터로 입력한 값을 URI 템플릿 변수의 값으로 대체
    • toUri() : URI 객체를 생성
  • RestTemplete 적용 (요청 전송)

    // 상위 코드에서 이어짐
    // 상황에 맞춰 3-1 ~ 3-4 중 선택하여 사용 
    
            // (3-1) Request 전송
            String result = restTemplate.getForObject(uri, String.class); 
            System.out.println(result); // String 형식으로 값을 받음
            
             // (3-2) Request 전송. WorldTime 클래스(DTO)로 응답 데이터를 전달 받는다.
            WorldTime worldTime = restTemplate.getForObject(uri, WorldTime.class);
            System.out.println("# datatime: " + worldTime.getDatetime());
            
            // getForObject() : HTTP Get 요청을 통해 서버의 리소스를 조회
    
            // (3-3) Request 전송. ResponseEntity로 헤더와 바디 정보를 모두 전달 받을 수 있다.
            ResponseEntity<WorldTime> response =
                    restTemplate.getForEntity(uri, WorldTime.class);
            System.out.println("# datatime: " + response.getBody().getDatetime());
            System.out.println("# HTTP Status Code: " + response.getStatusCode());
            System.out.println("# HTTP Status Value: " + response.getStatusCodeValue());
            System.out.println("# Content Type: " + response.getHeaders().getContentType());
            System.out.println(response.getHeaders().entrySet());
        }
    }
  • RestTemplete 적용 (요청 전송) - exchange() 를 사용한 응답 데이터 받기

            // (3-4) Request 전송. exchange()를 사용한 일반화 된 방식
            ResponseEntity<WorldTime> response =
                    restTemplate.exchange(uri,
                            HttpMethod.GET,
                            null,
                            WorldTime.class);
    
            System.out.println("# datatime: " + response.getBody().getDatetime());
            System.out.println("# timezone: " + response.getBody().getTimezone());
            System.out.println("# day_of_week: " + response.getBody().getDay_of_week());
            System.out.println("# HTTP Status Code: " + response.getStatusCode());
            System.out.println("# HTTP Status Value: " + response.getStatusCodeValue());
        }
    }
    • HTTP Method나 HTTP Request, HTTP Response 방식을 개발자가 직접 지정해서 유연하게 사용 가능
    • exchange(URI uri, HttpMethod method, HttpEntity< ? > requestEntity, Class< T > responseType)
      • URI url : Request를 전송할 엔드포인트의 URI 객체를 지정
      • HttpMethod method : HTTP Method 타입을 지정
      • HttpEntity< ? > requestEntity : HttpEntity 객체를 지정 (헤더 및 바디, 파라미터 등을 설정)
      • Class< T > responseType : 응답으로 전달 받을 클래스의 타입을 지정
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글