서버 호출 방식 (공통)
- 서버를 호출할 서비스 Class를 만든다.
- 원하는 기능을 호출할 메소드를 만든다.
- 해당 메소드의 반환형은 서버를 호출해서 전달받을 결과물의 형태와 같게 지정한다.
- UriComponentsBuilder Class를 통해서 호출할 서버의 URI를 생성한다.
- RestTemplate의 메소드를 호출 방식에 따라 설정하여 서버와 통신하여 결과물 받기
- 해당 결과물을 반환하기
URI 생성
URI uri = UriComponentsBuilder
.fromUriString("호출할 서버 주소") //예시 : http://localhost:8093
.queryParam(name, values) //정의 : uri에서 쓰는 query 값을 설정하는 메소드, 예시 : queryParam("name", "HongGilDong")
.path("호출할 path") //예시 : /api/server/hello
.encode() //정의 : uri의 기본 문자 set을 UTF-8로 변경
.build() //정의 : UriComponents로 변환
.toUri(); //정의 : uri로 변환
//.expand(값) : path의 값에서 중간에 {name}처럼 Path Value를 쓸 수 있는데 그 값을 차례대로 채워준다.
//({}가 두 번이면 expand()도 두 번)
//xxx.replaceQueryParam("name", "{name}").build().expand("홍길동").encode();
※ RestTemplate의 메소드로 파라미터로 사용될 값에 URI 대신에 String으로 주소를 직접 써도 된다.
RestTemplate를 통한 서버 호출 - GET 방식
- getForObject
- GET 요청을 보내고 Java Object로 매핑받아서 반환받음
- 장점
- 각각의 필드의 대한 값을 개별적으로 볼 수 있다.
- 기본 형식
- getForObject(URI, ResponseType)
- 사용 예시
RestTemplate restTemplate = new RestTemplate();
UserVO result = restTemplate.getForObject(uri, UserVO.class);
return result;
- getForEntity
- GET 요청을 보내고 ResponseEntity로 반환받음
- 장점
- HttpHeader나 HttpBody나 HttpStatus같은 정보들을 볼 수 있음
- 기본 형식
- getForEntity(URI, ResponseType)
- 사용 예시
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserVO> result = restTemplate.getForEntity(uri, UserVO.class);
return result.getBody();
RestTemplate를 통한 서버 호출 - POST 방식
- postForLocation
- POST 요청을 보내고 java.net.URI 로 반환받음
- 기본 형식
- postForLocation(URI, Request Object)
- 결과값 : URI
- 사용 예시
UserVO user
= UserVO.builder()
.name("HongGilDong").age(25).email("hong@naver.com")
.birthday("19970229").phoneNumber("0001112222")
.build();
RestTemplate restTemplate = new RestTemplate();
URI result = restTemplate.postForLocation(uri, user);
return result;
- postForObject
- POST 요청을 보내고 Java Object로 매핑받아서 반환받음
- 장점
- 각각의 필드의 대한 값을 개별적으로 볼 수 있다.
- 기본 형식
- postForObject(URI, Request Object, ResponseType)
- 사용 예시
UserVO user
= UserVO.builder()
.name("HongGilDong").age(25).email("hong@naver.com")
.birthday("19970229").phoneNumber("0001112222")
.build();
RestTemplate restTemplate = new RestTemplate();
UserVO result = restTemplate.postForObject(uri, user, UserVO.class);
return result;
- postForEntity
- POST 요청을 보내고 ResponseEntity로로 매핑받아서 반환받음
- 장점
- HttpHeader나 HttpBody나 HttpStatus같은 정보들을 볼 수 있음
- 장점
- 기본 형식
- postForEntity(URI, Request Object, ResponseType)
- 사용 예시
- POST 요청을 보내고 ResponseEntity로로 매핑받아서 반환받음
UserVO user
= UserVO.builder()
.name("HongGilDong").age(25).email("hong@naver.com")
.birthday("19970229").phoneNumber("0001112222")
.build();
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserVO> result = restTemplate.postForEntity(uri, user, UserVO.class);
return result.getBody();
RestTemplate를 통한 서버 호출 - PUT 방식
- put
- POST 요청을 보내고 java.net.URI 로 반환받음
- 기본 형식
- put(URI, Request Object)
- 사용 예시
UserVO user
= UserVO.builder()
.name("HongGilDong").age(25).email("hong@naver.com")
.birthday("19970229").phoneNumber("0003334444")
.build();
RestTemplate restTemplate = new RestTemplate();
restTemplate.put(uri, user);
RestTemplate를 통한 서버 호출 - DELETE 방식
- delete
- POST 요청을 보내고 java.net.URI 로 반환받음
- 기본 형식
- delete(URI)
- 사용 예시
//uri에 .queryParam("name", "HongGilDong") 추가
RestTemplate restTemplate = new RestTemplate();
restTemplate.delete(uri);
RestTemplate를 통한 서버 호출 - HTTP Method에 상관없이 호출하기
- exchange
- POST 요청을 보내고 java.net.URI 로 반환받음
- 장점
- Http Header를 수정할 수 있다.
- 기본 형식
- exchange(URI, HttpMethod, HttpEntity, responseType)
- exchange(RequestEntity, responseType)
※ RequestEntity와 ResponseEntity가 HttpEntity Class를 상속받고 있다.
- 사용 예시
//s:예시 1
UserVO user
= UserVO.builder()
.name("HongGilDong").age(25).email("hong@naver.com")
.birthday("19970229").phoneNumber("0001112222")
.build();
RequestEntity<UserVO> request = RequestEntity
.post(uri) //요청할 API 서버의 주소 설정
.contentType(MediaType.APPLICATION_JSON) //contentType 설정, org.springframework.http.MediaType
.header("x-authorization","my-header") //헤더 설정
.body(user); //몸체 설정 (= 전달할 데이터)
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserVO> response = restTemplate.exchange(uri, HttpMethod.POST, request, UserVO.class); //org.springframework.core.ParameterizedTypeReference
//e:예시 1
//s:예시 2
UserVO user
= UserVO.builder()
.name("HongGilDong").age(25).email("hong@naver.com")
.birthday("19970229").phoneNumber("0001112222")
.build();
RequestEntity<UserVO> request = RequestEntity
.post(uri) //요청할 API 서버의 주소 설정
.contentType(MediaType.APPLICATION_JSON) //contentType 설정, org.springframework.http.MediaType
.header("x-authorization","my-header") //헤더 설정
.body(user); //몸체 설정 (= 전달할 데이터)
RestTemplate restTemplate = new RestTemplate();
//org.springframework.core.ParameterizedTypeReference
ResponseEntity<UserVO> response = restTemplate.exchange(request, new ParameterizedTypeReference<>(){});
//e:예시 2