1. [HTTP 요청메시지 ]
•
HTTP message body에 데이터를 직접담아서 요청
◦
HTTP API에서 주로 사용, JSON, XML, TEXT
◦
데이터 형식은 주로 JSON 사용
◦
POST, PUT, PATCH
요청 파라미터와 다르게 HTTP 메시지 바디를 통해 데이터가 직접 넘어오는경우는 @RequestParam, @ModealAttribute를 사용할 수 없다. (물론 HTML Form 형식으로 전달되는 경우는 요청파라미터로 인정된다)
•
먼저 가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하는 예시코드는 아래와 같다.
•
HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다
public class ReqeustBodyStringController {
@PostMapping('/test')
public void requestbodyStringV1(HttpServletReqeust request, HttpServletResponse response) throws IOException{
String inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
response.getWriter().write("ok");
}
}
Java
복사
•
InputStream(Reader) : HTTP 요청 메시지 바디의 내용을 직접조회
•
OutPutStream(Writer) : HTTP 응답 메시지의 바디에 직접결과 출력
•
아래는 예시코드다
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody = {}", messageBody);
responseWriter.write("ok");
}
Java
복사
•
위에 2가지 방법보다 더 간결하게 body를 조회할 수 있는방법이 있다
•
HttpEntity를 이용하는것이다.
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messagebody = httpEntity.getBody();
log.info("messagebody-v3 = {}", messagebody);
return new HttpEntity<>("ok");
}
Java
복사
스프링 MVC는 다음 파라미터를 지원한다.
•
HttpEntity : HTTP header, body정보를 편리하게 조회
◦
메시지 바디 정보를 직접 조회
◦
요청 파라미터를 조회하는 기능과 관계없음 (@RequestParam,@ModelAttribute랑 전혀상관없다!!!)
•
HttpEntity는 응답에도 사용가능
◦
메시지 바디 정보 직접 반환
◦
헤더 정보 포함기능
◦
view 조회 x
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messagebody = httpEntity.getBody();
log.info("messagebody-v3 = {}", messagebody);
return new HttpEntity<>("ok");
}
Java
복사
HttpEntity를 상속받은 다음 객체들도 같은 기능을 제공하낟
•
RequestEntity
◦
HttpMethod,url정보가 추가, 요청에서 사용
•
ResponseEntiy
◦
Http 상태코드 설정가능, 응답에서 사용
◦
return new ResponseEntity<String>(”Hello World”, responseHeaders, HttpStatus.CREATED)
•
실무에서 많이 쓰는 더 간단한 방법이 있다
•
@RequestBody 를 이용하는 방식이다
@ㄲ
@RequestBody 를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회 할 수 있다. 참고로 헤더 정보가 필요하다면 HttpEntity를 사용하거나 @RequestHeader를 사용하면된다. 이렇게 메시지 바디를 직접조회하는 기능은 요청파라미터 RequestParam, ModelAttribute와 전혀 상관없다
[ 요청파라미터 vs HTTP 메시지 바디]
•
요청파라미터를 조회하는 기능 @RequestParam, @ModelAttribute
•
HTTP 메시지 바디를 직접조회하는 기능 @RequestBody
@ResponseBody 를 사용하면 응답결과를 HTTP 메시지 바디에 직접담아서 전달할 수 있다.물론 이 경우에도 view를 사용하지않는다