백엔드 개발을 할때는 Server의 입장이 되어서 API를 제공해보는 것이 중요함.
Client가 되어서 어떻게 실제로 서버에게 데이터를 던져주고, 받아오는지 알아보겠다.
1. 기본적인 RestTemplate사용 [GET]- getForObject() , getForEntity();
[Client]
@RestController
@RequestMapping("/api/client")
public class ApiController {
private final RestTemplateService restTemplateService;
public ApiController(RestTemplateService restTemplateService) {
this.restTemplateService = restTemplateService;
}
@GetMapping
public String getHello(){
return restTemplateService.hello();
}
}
@Service
public class RestTemplateService {
//http://localhost/api/server/hello
public String hello(){
URI uri = UriComponentsBuilder //주소를 만들떄 : UriComponentBuilder를 사용
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.encode()
.build()
.toUri();
RestTemplate restTemplate = new RestTemplate();
//RestTemplate Pool을 만들어서 사용해야 한다.
//String result = restTemplate.getForObject(uri, String.class);
ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
//return result;
return result.getBody();
}
[Server]
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("/hello")
public String hello(){
return "hello zeroco";
}
}
# getForEntity
public <T> org.springframework.http.ResponseEntity<T> getForEntity(java.net.URI url, Class<T> responseType)
- header및 상세정보를 얻기 위해서 getForEntity를 사용하는 것을 추천
ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
# getForObject
public <T> T getForObject(java.net.URI url, Class<T> responseType)
String result = restTemplate.getForObject(uri, String.class);
2. Server로 부터 JSON 형식으로 받기
먼저 response 받을 DTO 생성 - 간단한 고객정보를 받는다고 가정
[Client]
@Getter
@Setter
public class UserResponse {
private String name;
private int age;
}
// getForObject보단 getForEntity, ResonseEntity로 받는 것이 좋아 보임
ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri, UserResponse.class);
UserResponse result = restTemplate.getForObject(uri, UserResponse.class);
기존방식에선 String 으로 return 값을 주었으므로 각각 Controller, Service 각 변경 필요
@Service
public class RestTemplateService {
public UserResponse hello(){
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.encode()
.build()
.toUri();
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri, UserResponse.class);
return result.getBody();
}
}
[Server]
서버도 마찬가지로 DTO 작성 하여 Client가 원하는 데이터를 JSON 형식으로 내려준다.
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("/hello")
public User hello(){
User user = new User();
user.setName("zeroco");
user.setAge(10);
return user;
}
}
# 참조
UriComponetBuilder
.queryParam을 사용하여 파라미터를 보낼 수 있음.
fromHttpUrl으로 사용가능
URI uri = UriComponentsBuilder //주소를 만들떄 : UriComponentBuilder를 사용
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.queryParam("name", "zeroco")
.encode()
.build()
.toUri();
static UriComponentsBuilder | fromUri(URI uri)
Create a builder that is initialized from the given URI.
|
static UriComponentsBuilder | fromUriString(String uri)
Create a builder that is initialized with the given URI string.
|
UriComponentsBuilder | queryParam(String name, Collection<?> values)
Variant of UriBuilder.queryParam(String, Object...) with a Collection.
|
UriComponentsBuilder (Spring Framework 5.3.21 API)
Request to have the URI template pre-encoded at build time, and URI variables encoded separately when expanded. In comparison to UriComponents.encode(), this method has the same effect on the URI template, i.e. each URI component is encoded by replacing no
docs.spring.io
'Backend > Spring & SpringBoot' 카테고리의 다른 글
RestTemplate 사용법 (2) Naver API 사용하기 (0) | 2022.06.26 |
---|---|
[스프링 인 액션 5장] Spring 자동구성, Logback 활용 (1) | 2022.06.05 |
[스프링 인 액션 3장] Spring JDBC 사용 (0) | 2022.05.22 |
Spring Boot Test하기 [1] (0) | 2022.05.08 |
Hypermedia-Driven RESTful Web Services : Spring HATEOAS 구현방법 [2] (0) | 2022.04.18 |