
지금까지는 항상 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 |