@Slf4j
@Controller
public class RequestBodyJsonController {
private ObjectMapper objectMapper = new ObjectMapper();
@ResponseBody
@PostMapping("/request-body-json-v1")
public String requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
InputStream ip = request.getInputStream();
String messageBody = StreamUtils.copyToString(ip, StandardCharsets.UTF_8);
HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(HttpEntity<HelloData> entity) {
HelloData helloData = entity.getBody();
log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(@RequestBody HelloData helloData) {
log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
return "ok";
}
@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData helloData) {
log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
return helloData;
}
}
json 전용 라이브러리 객체인 ObjectMapper 이용한다.
먼저 똑같이 그냥 String 형식으로 만들고 받아서, objectMapper를 이용한다.
objectMapper.readValue(String형식의 json 데이터, 변화할 대상의 클래스)
@RequestBody는 아예 바디를 받는 것이다.
HttpEntity라는 컨버터를 이용해 받는 것이다. String이니 HttpEntity라는 컨버터로 String으로 변환시켜준다.
v3보면 알 수 있듯이 지정한 유형으로 변화시켜준다.
그래서 @RequestBody HelloData helloData도 변화시켜 주는거다. HttpEntity<HelloData>와 같다.
@RequestBody가
바디(json) -> Http메시지컨버터(HttpEntity) -> 객체였다면
@ResponseBody는
객체 -> Http메시지컨버터 -> 바디(json)이다.
참고로,
@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(HelloData helloData) {
log.info("name={}, age={}",helloData.getUsername(), helloData.getAge());
return helloData;
}
그냥 이런 식으로 하는 건 바디를 읽는게 아니다.
저렇게 하면 Get url 파라미터나 form을 통한 파라미터만 읽는다. 그게 기본값이다.
그래서 바디를 읽을 때는 @RequestBody로 해줘야 한다.
'스프링 > 3. 스프링 MVC' 카테고리의 다른 글
47. HTTP API (0) | 2023.08.13 |
---|---|
46. 정적 리소스, 뷰 템플릿 (0) | 2023.08.13 |
44. HTTP API (0) | 2023.08.12 |
43. ModelAttribute (0) | 2023.08.12 |
42. 스프링으로 파라미터 꺼내기 (0) | 2023.08.12 |