클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음 3가지 방법을 사용
@RequestParam.required
/request-param 요청
- username 이 없으므로 400 예외가 발생함
주의! - 파라미터 이름만 사용
주의! - 기본형(primitive)에 null 입력
파라미터를 Map, MultiValueMap으로 조회가능
@ModelAttribute HelloData helloData
HTTP message body에 데이터를 직접 담아서 요청
방법1. HttpServletRequest, HttpServletResponse 사용
@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException
{
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8);
...
방법2. InputStream(Reader), OutputStream(Writer) 사용 - Spring MVC에서 지원
public void requestBodyStringV2 (InputStream inputStream, Writer responseWriter) throws IOException
{
String messageBody = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8);
}
방법3. HttpEntity 사용
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
방법4. @RequestBody, @ResponseBody 사용
@RequestBody
@ResponseBody
방법1. HttpServletRequest를 사용
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/request-body-json-v1")
public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException
{
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
response.getWriter().write("ok");
}
방법2. @RequestBody 문자 변환
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
return "ok";
}
방법3. @RequestBody 객체 변환
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data) {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
방법4. 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";
}
방법5. @ResponseBody를 사용하여 메세지 바디 정보 직접 반환 가능
@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData data) {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return data;
}