0. 개요
- 이전 포스팅에서 Request parameter를 조회하는 방법에 대해서 알아보았다.
- Request Body는 Client가 POST method를 사용한 요청에서 사용된다.
- POST 방식을 사용한 요청은 HTTP message body에 데이터를 담아 Server에게 전달한다.
- 이때 데이터는 JSON 형식으로 작성되는 것이 일반적이다.
- 이번 포스팅에서는 Server 측에서 Reqeust Body를 조회하는 방법에 대해 알아보자.
1. HttpServlet
- HttpServletRequest를 통해 Request Body를 조회하는 방법을 알아보자.
@Slf4j
@Controller
public class RequestBodyController {
@PostMapping("/requestbody/servlet")
public void usingHttpServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody = {}", messageBody);
response.getWriter().write("request body using Servlet");
}
}
- Client가 Request body를 전달할 때에는 반드시 POST 방식을 사용해야 한다.
- 그러므로 Server 측에서 요청을 받을 때 POST 방식의 요청만을 허용하도록 @PostMapping을 설정한다.
- POST 방식으로 들어오는 요청이기 때문에 getParameter() 또는 getParameterValues()를
사용하여 데이터를 읽을 수 없다.
→ POST 방식은 URL parameter 형식이 아닌 JSON 형식으로 데이터가 전달되기 때문이다.
- Servlet을 이용하여 Request body를 받을 때에는 getInputStream() 또는 getReader()를 사용한다.
* 주의하자!
→ Stream을 사용하는 경우 Byte 단위로 값을 반환한다. 그러므로 반드시 인코딩 작업을 거쳐야 한다.
2. InputStream
- InputStream을 이용하여 Request body를 받아올 수 있다.
@Slf4j
@Controller
public class RequestBodyController {
@PostMapping("/requestbody/inputstream")
public void usingInputStream(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody = {}", messageBody);
responseWriter.write("request body using InputStream");
}
}
* 주의하자!
→ Stream을 사용하는 경우 Byte 단위로 값을 반환한다. 그러므로 반드시 인코딩 작업을 거쳐야 한다.
3. HttpEntity
- HttpEntity를 사용하면 Spring이 알아서 Request Body의 내용을 읽는다.
- HttpEntity를 응답(response)에 사용하면 Client에게 Response body에 메시지를 담아 전달할 수 있다.
@Slf4j
@Controller
public class RequestBodyController {
@PostMapping("/requestbody/http-entity")
public HttpEntity<String> usingHttpEntity(HttpEntity<String> httpEntity) throws IOException {
String messageBody = httpEntity.getBody();
log.info("messageBody = {}", messageBody);
return new HttpEntity<>("request body using HttpEntity");
}
}
a) RequestEntity & ResponseEntity
- Request/ResponseEntity는 HttpEntity를 상속받은 하위 개념이다.
- 이를 사용하면 Response body에 메시지와 함께 상태 코드를 Client에게 전달할 수 있다.
@Slf4j
@Controller
public class RequestBodyController {
@PostMapping("/requestbody/request-entity")
public HttpEntity<String> usingRequestEntity(RequestEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
log.info("messageBody = {}", messageBody);
return new ResponseEntity<>("request body using RequestEntity", HttpStatus.ACCEPTED);
}
}
4. @RequestBody
- @RequestBody를 사용하면 Spring이 알아서 Request body의 내용을 읽어준다.
- 아래의 코드에서는 응답을 전달하는 역할로 @ResponseBody를 사용하였다.
- @ResponseBody를 사용하면 메서드의 반환 값을 viewname이 아니라 String으로 처리한다.
@Slf4j
@Controller
public class RequestBodyController {
@ResponseBody
@PostMapping("/requestbody/request-body")
public String usingRequestBody(@RequestBody String messageBody) {
log.info("messageBody = {}", messageBody);
return "Using @RequestBody and @ResponseBody";
}
}
'Back-end > Spring MVC 개념' 카테고리의 다른 글
17. Response 처리방법 (0) | 2022.03.17 |
---|---|
16. Request - JSON 조회방법 (0) | 2022.03.16 |
14. Request - URL parameter 조회방법 (0) | 2022.03.14 |
13. Annotation 기반의 URL 매핑 (0) | 2022.03.10 |
12. Annotation 기반의 Spring MVC (0) | 2022.03.09 |
댓글