본문 바로가기
Spring(JAVA Framework)/Spring MVC

HTTP Request - (2) (feat. Request Message Body)

by 걸어가는 신사 2021. 9. 17.

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 상태 코드 설정 가능

(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

댓글