본문 바로가기

Backend/Spring & SpringBoot

RestTemplate 사용법 (1) - getForObject(), getForEntity()

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;
    }
}

JSON 형식으로 잘받아온것을 확인 가능


# 참조

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

 

728x90