말 그대로 단순하게 body에 있는 데이터를 stream으로 받는 방법
@PostMapping("/request-body-string-v1")
public void requestBodyStringV2(InputStream inputStream, Writer writer) throws IOException {
String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody = {}", body);
writer.write("ok");
}
스프링의 http message converter가 요청메시지의 HttpEntity를 가져온다.
@PostMapping("/request-body-string-v2")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity){
String body = httpEntity.getBody();
log.info("body = {}",body);
return new HttpEntity<>("ok");
}
HttpEntity<String>
으로 자료형을 명시하면 메시지 바디에 있는 데이터를 자료형에 따라 가져온다.
HtppEntity는 헤더, 바디 정보를 편리하게 조회할 수 있는 객체이고 메시지 바디를 직접 조회할 수 있다. (요청 파라미터와는 전혀 상관없다, 전혀 다른 메커니즘)
httpEntity를 상속받아 기능을 확장한 RequestEntity, ResponseEntity가 있다.
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody){
log.info("messageBody = {}", messageBody);
return "ok";
}
마찬가지로 HttpMessageConverter를 사용한다.
스프링은 메서드 파라미터에 어노테이션이 생략되면 다음과 같은 규칙을 적용한다.
@RequestBody
를 생략하면 안 된다.요청 메시지에 따라 적절한 HttpMessageConveter가 선택되어 수행된다.
content-type : application/json
=> MappingJackson2HttpMessageConveter
Json요청 -> Http 메시지 컨버터 -> 객체
Accept-type : application/json
=> MappingJackson2HttpMessageConveter
객체 -> Http 메시지 컨버터 -> Json 응답