Spring

[ Spring ] restTemplate

인생은단짠단짠 2022. 11. 11. 12:31

 

지금까지는 항상 server의 입장에서 API를 제공하는 방법에 대해 공부했다.

여기서 더 나아가, 백엔드에서 client가 되어 다른 server와 연결하는 것도 필수적이다.

 

이 때 사용하는 것이 restTemplate이다.

 

Get 요청하기

 

Object로 받기

 public void getForObject(){
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:9090")
                .path("/api")
                .queryParam("name","steve")
                .queryParam("age",10)
                .encode()
                .build()
                .toUri();
        log.info("uri : {}",uri);

        RestTemplate restTemplate = new RestTemplate();
        User user = restTemplate.getForObject(uri, User.class);
        log.info("user : {}", user);
 }
  • urI를 만들 때는 많은 수단이 있지만 주로 UriComponentsBuilder를 사용한다.
  • queryParam은 쿼리 스트링을 만들어주는 것이다.
  • encode는 붙여주는 것이 좋다.
  • getForObject메소드를 통해 가져올 수 있는데 여기서 get을 GET방식으로 보내는 것을 의미한다. 

 

 

ResponseEntity로 받기

public void getForEntity(){
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:9090")
                .path("/api/{path}")
                .queryParam("name","steve")
                .queryParam("age",10)
                .encode()
                .build()
                .expand("user")
                .toUri();
        log.info("uri : {}", uri);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<User> response = restTemplate.getForEntity(uri, User.class);
        log.info("{}",response.getStatusCode());
        log.info("{}",response.getHeaders());
        log.info("{}",response.getBody());
}
  • expand() 는 순서대로 {}에 들어간다 (path - variable에 사용)
  • entity로 받기 때문에 getForEntity를 사용한다.

 

 

Post 요청하기

 

post로 보내고 object로 받기 

 public void postForObject(){
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:9090")
                .path("/api/{path}")
                .encode()
                .build()
                .expand("user")
                .toUri();
        log.info("uri : {}", uri);

        RestTemplate restTemplate = new RestTemplate();

        User user = new User();
        user.setName("홍길동");
        user.setAge(10);
        User response = restTemplate.postForObject(uri, user, User.class);
        log.info("response : {}", response);
}
  • 보낼 때는 uri, 받는 클래스 뿐만 아니라 보내는 객체도 함께 들어간다.

 

post로 보내고 entity로 받기

 public void postForEntity(){
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:9090")
                .path("/api/{path}")
                .encode()
                .build()
                .expand("user")
                .toUri();
        log.info("uri : {}", uri);

        User user = new User();
        user.setName("홍길동");
        user.setAge(10);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<User> response = restTemplate.postForEntity(uri, user, User.class);
        log.info("{}",response.getStatusCode());
        log.info("{}",response.getHeaders());
        log.info("{}",response.getBody());
}

 

exchange

public void exchange(){
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:9090")
                .path("/api/{path}/header")
                .encode()
                .build()
                .expand("user")
                .toUri();
        log.info("uri : {}", uri);

        User user = new User();
        user.setName("홍길동");
        user.setAge(10);

        RequestEntity<User> req = RequestEntity
                .post(uri)
                .contentType(MediaType.APPLICATION_JSON)
                .header("x-authorization","my-header")
                .body(user);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<User> response = restTemplate.exchange(req, new ParameterizedTypeReference<>(){});
        log.info("{}",response.getStatusCode());
        log.info("{}",response.getHeaders());
        log.info("{}",response.getBody());
}
  • header는 고정되어 있지만, body는 뭐가 올지 모르는 상황일때의 코드이다.
  • header를 적용하기 싶을 때 exchange를 사용한다
  • body에 뭐가 올지 모르기 때문에 제너릭을 사용했고 제너릭에 .class를 붙일 수 없어서 ParameterizedTypeReference 를 활용했다.

 

외부 API 에 요청해보기 - 수정

 public void naver(){
        URI uri = UriComponentsBuilder
                .fromUriString("https://openapi.naver.com")
                .path("/v1/search/local.json")
                .queryParam("query","갈비집")
                .queryParam("display","10")
                .queryParam("start","1")
                .queryParam("sort","random")
                .encode(Charset.forName("UTF-8"))
                .build()
                .toUri();
        log.info("uri : {}", uri);

        RequestEntity<Void> req = RequestEntity
                .get(uri)
                .header("X-Naver-Client-Id","Zi3o1uQftp59zuIqEAz4")
                .header("X-Naver-Client-Secret","iy6YKSWpLM")
                .build();

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.exchange(req, new ParameterizedTypeReference<>(){});
        log.info("{}",response.getStatusCode());
        log.info("{}",response.getHeaders());
        log.info("{}",response.getBody());
}

 

object로 받는 것보다 entity로 받고 넘기는 것이 유지보수 측면에서 더 좋은 방법인 것 같다. 

 

'Spring' 카테고리의 다른 글

[ Spring ] 트랜잭션  (0) 2022.12.12
[ Spring ] 의존성 주입 방법 (feat.lombok)  (0) 2022.11.23
[ Spring ] Swagger이란  (0) 2022.11.17
[spring] 어노테이션 (Annotaions)  (0) 2022.11.04
[ Spring ] Get/Post 와 ObjectMapper  (0) 2022.11.03