728x90
반응형
HTTP 요청메세지 Text 편
- HTTP Message Body에 데이터가 담겨 요청이올때 처리하는 방법을 알아본다.
- HTTP API 에서 주로 사용된다.
- JSON, XML, TEXT - 주로 JSON 사용
- POST, PUT, PATCH
- 메세지 BODY 를 통에 데이터가 넘어오는 경우 @RequestParam, @ModelAttribute 사용 못한다.
- FORM 으로 넘어오는건 가능하다.
Message Body 가져오는 방법
HttpServletRequest V1
@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest req, HttpServletResponse res) throws IOException {
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
res.getWriter().write("ok");
}
InputStream V2(V1 개선)
- 파라미터 값으로 Inpustream 과 Writer 를 직접 사용할수 있다.
- InputStream(Reader): HTTP 요청메시지 바디의 내용을 조회
- OutputStream(Writer) HTTP 응답 메시지의 바디에 직접 결과를 출력
//inputstream 과 reader 를 바로 받을수 있다.
@PostMapping("/request-body-string-v2")
public void requestBodyString2(InputStream inputStream, Writer responseWriter) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
responseWriter.write("ok");
}
HttpEntity V3(V2 개선)
- HttpEntity 를 이용하면 Header 와 Body 정보를 쉽게 조회 할 수 있다.
- HttpEntity 를 리턴 값으로 사용하게 되면 View를 조회 하지 않는다.
- 메시지 바디에 데이터를 직접 넣어서 반환한다. - T 타입이 String 인 경우 스프링에서 MessageConverter를 이용하여 Body 내용을 문자로 넘겨준다.
// !!!!!! 요청 파라미터는 GET 의 쿼리스트링 또는 , POST 의 HTML form 데이터 전송하는 방식 인 경우에만
// @RequestParam, ModelAttritube 해당 어노테이션을 사용한다.
@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyString3(HttpEntity<String> httpEntity) throws IOException {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
// 이렇게 하면 body에 데이터를 넣어준다.
return new HttpEntity<String>("ok");
}
ResponseEntity, RequestEntity V3
- RequestEntity: HttpMethod, url 정보가 추가, 요청에 사용
- ResponseEntity: HTTP 상태코드 설정가능, 응답에 사용한다.
@PostMapping("/request-body-string-v3-1")
public ResponseEntity<String> requestBodyString3_1(RequestEntity<String> httpEntity) throws IOException {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
// 이렇게 하면 body에 데이터와 상태코드를 넣을수 있다.
return new ResponseEntity<String>("OK",HttpStatus.CREATED);
}
ResponseBody, RequestBody V4(V3 개선)
ResponseBody: 를 이용하면 데이터와 상태코드를 넣을수 있다.
RequestBody: 실무에서 많이 쓴다. 그냥 데이터를 바로 스트링으로 가져온다.
// 응답 RequestBody 실무에서 엄청 많이 쓴다.
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyString4(@RequestBody String messageBody) throws IOException {
// 끝이다.
log.info("messageBody={}", messageBody);
// 이렇게 하면 body에 데이터와 상태코드를 넣을수 있다.
return "OK";
}
HTTP 요청메세지 JSON 편
HttpServletRequest V1
- HttpServletRequest 를 이용한다
- 문자로된 데이터를 jackson 의 objectMapper 를 사용하여 자바 객체로 변환한다. - objectMapper.readValue
- 문자를 객체로 변환 해주는 역할을 한다.
@PostMapping("request-body-json-v1")
public void requestBodyJsonV1(HttpServletRequest req, HttpServletResponse resp) throws IOException {
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
resp.getWriter().write("OK");
}
RequestBody V2(V1 개선)
- RequestBody 를 직접 파라미터로 사용한다.
@ResponseBody
@PostMapping("request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
log.info("messageBody={}", messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "OK";
}
RequestBody V3(V2개선)
- 객체를 직접 사용할수 있다.
- RequestBody 는 생략할수 없다.
- 생략하게 되면 @ModelAttribute 가 적용된다. 바디의 메시지가 아니라 요청파라미터를 처리한다.
- 바디로 메세지를 담아서 오면 파라미터가 없기때문에 Null 값이 들어가게 된다.
@ResponseBody
@PostMapping("request-body-json-v3")
// RequesBody 객체를 지정할수 있다.
// HTTP 메세지 컨버터가 알아서 데이터를 넣어준다.
// JSON 이구나 객체에 맞게 반환해준다.
// @RequestBody 생략하면 안된다.
// 값이 안들어가는 이유는 생략하면 모델 어트리뷰트가 된다. 즉 요청 파라미터를 처리하게 된다.
public String requestBodyJsonV3(@RequestBody HelloData helloData) throws IOException {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "OK";
}
HttpEntity V4
@ResponseBody
@PostMapping("request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> httpEntity) throws IOException {
HelloData data = httpEntity.getBody();
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "OK";
}
ResponseBody V5
- @ResponseBody가 있는 경우 객체를 직접 리턴 할수 있다.
- 컨버터가 알아서 바디에 객체를 JSON으로 넘겨준다.
@ResponseBody
@PostMapping("request-body-json-v5")
// 나갈때 ResponseBody 가 있으면 컨버터가 알아서 바디에 넣어준다.
// 객체가 JSON 으로 바껴 body에 들어간다.
public HelloData requestBodyJsonV5(@RequestBody HelloData data) throws IOException {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return data;
}
참고
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
728x90
반응형
'Spring > spring mvc 1 스터디' 카테고리의 다른 글
[Spring] Message Converter (0) | 2021.11.25 |
---|---|
[Spring] HTTP 응답 (0) | 2021.11.21 |
[Spring] HTTP 요청파라미터 (0) | 2021.11.13 |
[Spring] 요청매핑 (0) | 2021.11.10 |
[Spring] Spring Controller 다루기 (0) | 2021.11.06 |
댓글