HttpEntity
Entity의 사전적 의미는 개체로서 하나 이상의 속성(정보)로 구성됩니다.
HttpEntity는 Http 통신의 속성들을 가지고 있는 개체입니다.
이 때 속성이라하면 headers, body입니다.
즉 HttpEntity는 HTTP 요청, 응답의 속성들을 가지고 있는 개체입니다.
실제 요청(HttpRequest) , 응답(HttpResponse)객체가 아니라
그에 관한 속성들을 나타내는( represent) 클래스입니다.
다음은 예제코드에 사용될 Dto입니다.
@Data
public class StudentDto {
private Long id;
private String name;
private int age;
}
ResponseEntity
HttpEntity를 상속받은 클래스로 응답에 관한 속성들을 나타내는 클래스입니다.
Header, Body + Status Code를 가지고 있습니다.
기본적으로 @Controller 메소드의 return 값은 viewName이거나
@ResponseBody와 함께 사용될 때 Body데이터를 의미지만,
ResponseEntity를 return하게 되면 response 객체에 대한 header, body, status를 직접 설정 가능합니다.
다음은 Response의 사용예시입니다.
@RequestMapping("/responseEntity")
public ResponseEntity responseEntity(){
if(false){
//header or body 내용 설정하고 싶으면 하기
return new ResponseEntity(null, HttpStatus.BAD_REQUEST); //뭔가 문제가 있으면 이런식으로
}
HttpHeaders headers= new HttpHeaders(); //header 설정 할거면 설정.
StudentDto student= new StudentDto();
return new ResponseEntity<>(student,headers, HttpStatus.OK); //body, header, code 전달
}
RequestEntity
ResponseEntity와 마찬가지로 request 객체에 대한 header, body, status 를 직접 설정 가능합니다.
보통은 API에서 원하는 요청방법에 따라 쉽게 요청하기 위해 RequestEntity 객체를 사용합니다.
RestTemplate를 이용해 위에서 만든 /responseEntity로 요청을 해보겠습니다.
@ResponseBody
@RequestMapping("/requestEntity")
public StudentDto requestEntity(){
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:8080") //http://localhost에 호출
.path("/responseEntity")
.encode()
.build()
.toUri();
RequestEntity<String> requestEntity = new RequestEntity<>(HttpMethod.GET, uri);
RestTemplate restTemplete = new RestTemplate();
ResponseEntity<StudentDto> result = restTemplete.exchange(requestEntity, StudentDto.class); //위 /responseEntity가 return한 ResponseEntity
StudentDto student= result.getBody() ;
System.out.println(student);
return student;
}