Request Parameter와 다르게, HTTP Message Body를 통해 데이터가 직접 데이터가 넘어오는 경우
1. Text
(1) HttpEntity
/**
* HttpEntity: HTTP header, body 정보를 편라하게 조회
* - 메시지 바디 정보를 직접 조회(@RequestParam X, @ModelAttribute X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*
* 응답에서도 HttpEntity 사용 가능
* - 메시지 바디 정보 직접 반환(view 조회X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*/
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
- HttpEntity : HTTP header, body 정보를 편리하게 조회
- 메시지 바디 정보를 직접 조회
- HttpEntity는 응답에서도 사용 가능
- 메시지 바디 정보 직접 반환
- 헤더 정보 포함 가능
- view 조회 X
- HttpEntity를 상속받은 다음 객체들도 같은 기능을 제공한다.
- RequestEntity
- HttpMethod, url 정보가 추가
- ResponseEntity
- Http 상태 코드 설정 가능
- RequestEntity
(2) @RequestBody
/**
* @RequestBody
* - 메시지 바디 정보를 직접 조회(@RequestParam X, @ModelAttribute X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*
* @ResponseBody
* - 메시지 바디 정보 직접 반환(view 조회X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*/
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {
log.info("messageBody={}", messageBody);
return "ok";
}
- @RequestBody
- HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.
헤더 정보가 필요하다면 HttpEntity를 사용하거나 @RequestHeader를 사용한다.
2. JSON
(1) @RequestBody 문자 변환
/**
* @RequestBody
* HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*
* @ResponseBody
* - 모든 메서드에 @ResponseBody 적용
* - 메시지 바디 정보 직접 반환(view 조회X)
* - HttpMessageConverter 사용 -> StringHttpMessageConverter 적용
*/
private ObjectMapper objectMapper = new ObjectMapper();
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
- @RequestBody를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장한다.
- 문자로 된 JSON 데이터인 messageBody를 objectMapper를 통해서 자바 객체로 변환한다.
(2) @RequestBody 한 번에 객체로 변환
/**
* @RequestBody 생략 불가능(@ModelAttribute 가 적용되어 버림)
* HttpMessageConverter 사용 -> MappingJackson2HttpMessageConverter (contenttype: application/json)
*
*/
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
- @RequestBody에 직접 만든 객체를 지정할 수 있다.
- @RequestBody는 생략 불가능
- @HelloData에 @RequestBody를 생략하면 @ModelAttribute가 적용된다.
- 이경우 HTTP Message Body가 아니라 Request Parameter를 처리하게 된다.
(3) HttpEntity
@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) {
HelloData data = httpEntity.getBody();
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
- HttpEntity로도 JSON 처리가 가능하다.
HttpEntity, @RequestBody를 사용하면 HTTP Message Converter가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해준다.
HTTP Message Converter는 문자뿐만 아니라 JSON도 객체로 변환해준다.
@RequestBody 요청
JSON 요청 -> HTTP Message Converter -> 객체
@ResponseBody 응답
객체 -> HTTP Message Converter -> JSON 응답
반응형
'Spring(JAVA Framework) > Spring MVC' 카테고리의 다른 글
HTTP Message Converter (0) | 2021.09.18 |
---|---|
HTTP Response (0) | 2021.09.18 |
HTTP Request - (1) (feat. Request Parameter) (0) | 2021.09.16 |
@RequestMapping (0) | 2021.09.15 |
SpringMVC 구조 (0) | 2021.09.15 |
댓글