[Spring MVC] #4 기본 기능 (3) HTTP 요청 메시지

Jaeyoo (유재형)·2022년 2월 14일
0

SpringMVC

목록 보기
11/12
post-thumbnail
post-custom-banner

HTTP message body에 데이터를 직접 담아서 요청해보자.
요청 파라미터와는 다르게 @RequestParam , @ModelAttribute 를 사용할수없다.


HTTP 요청 메시지


request.getInputStream()

@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);
          log.info("messageBody={}", messageBody);
          response.getWriter().write("ok");
} 
  • stream은 바이트 코드이므로 항상 인코딩 해주어야한다.

Input, Output 스트림

@PostMapping("/request-body-string-v2")
public void requestBodyString(InputStream inputStream, Writer responseWriter) throws IOException {
      String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
      log.info("messageBody={}", messageBody);
      responseWriter.write("ok");
  • InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회
  • OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력

HttpEntity

@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyString(HttpEntity<String> httpEntity) {
      String messageBody = httpEntity.getBody();
      log.info("messageBody={}", messageBody);
      return new HttpEntity<>("ok");
  }
  • HttpEntity
    • HTTP header, body 정보를 편리하게 조회
      • 메시지 바디 정보를 직접 조회
      • 요청 파라미터를 조회하는 기능과 관계없다.
    • 응답에도 사용 가능
      • 메시지 바디 정보 직접 반환
      • 헤더 정보 포함 가능
      • view 조회 x
  • HttpEntity를 상속받은 객체
    • RequestEntity
      • HttpMethod, url 정보가 추가, 요청에서 사용
    • ResponseEntity
      • HTTP 상태 코드 설정 가능, 응답에서 사용

RequestBody

@ResponseBody
@PostMapping("/request-body-string")
public String requestBodyString(@RequestBody String messageBody) {
        log.info("messageBody={}", messageBody);
        return "ok";
    }
  • 헤더 정보 필요할땐 @RequestHeader 사용

JSON


REST api 에서 주로 사용하는 JSON 데이터 형식을 조회해보자

request.getInputStream()

@Controller
public class RequestBodyJsonController {

      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);
          log.info("username={}, age={}", data.getUsername(), data.getAge());
          
          response.getWriter().write("ok");
      }
}
  • HttpServletRequest 를 사용해서 직접 HTTP 메시지 바디에서 데이터를 읽어와 문자로 변환
  • 문자로된 JSON 데이터를 Jackson 라이브러리인 objectMapper 를 사용해 자바 객체로 변환

@RequestBody

@ResponseBody
@PostMapping("/request-body-json")
public String requestBodyJson(@RequestBody String messageBody) throws IOException {
      HelloData data = objectMapper.readValue(messageBody, HelloData.class);
      log.info("username={}, age={}", data.getUsername(), data.getAge());
      return "ok";
}
  • @RequestBody를 사용해서 HTTP 메시지에서 데이터를 꺼내고 messageBody에 저장
  • 문자로된 JSON 데이터인 messageBody를 objectMapper를 통해 자바 객체로 변환

@RequestBody 객체 변환

@ResponseBody
@PostMapping("/request-body-json")
public String requestBodyJson(@RequestBody HelloData data) {
        log.info("username={}, age={}", data.getUsername(), data.getAge());
        return "ok";
    }
  • @RequestBody에 직접 만든 객체를 지정할수있다.
  • HttpEntity, @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체로 변환해준다.
profile
기록과 반복
post-custom-banner

0개의 댓글