728x90
백엔드 개발을 할때는 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.
|
728x90
'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 |