HTTP 요청 메세지

  • HTTP Message Body에 데이터를 직접 담아서 요청하는 경우

    • 요청 파라미터와 다르게 @RequestParam, @ModelAttribute 사용 불가
    • HTML Form 형식은 요청 파라미터로 인정되므로 가능
  • HTTP API에서 주로 사용됨

    • type: JSON, XML, Text

    • method: POST, PUT, PATH

단순 텍스트

01. InputStream 사용

  • @PostMapping("/request-body-string-v2")
    public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
         // stream으로 받으면 byte코드이므로 인코딩을 설정해줘야함 (default: OS 기본설정)
         String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
      
         log.info("messageBody={}", messageBody);
         responseWriter.write("ok");
    }
    

02. HTTPEntity 사용

  • header, body 정보를 편리하게 조회
  • 응답에도 사용 가능 (view 조회는 X)

  • @PostMapping("/request-body-string-v3")
     public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
      
         // HTTP Content Body를 받아옴
         String body = httpEntity.getBody();
         log.info("messageBody={}", body);
      
         return new HttpEntity<>("ok");
     }
    
  • HTTP 메세지 바디를 읽어서 문자나 객체로 변환해서 전달해줌

    • => ‘HttpMessageConverter’라는 기능을 사용

03. @RequestBody, @ResponseBody 사용

  • @ResponseBody
    @PostMapping("/request-body-string-v4")
    public String requestBodyStringV4(@RequestBody String messageBody) throws IOException {
      
        log.info("messageBody={}", messageBody);
      
        return ("ok");
    }
    
  • 이 기능을 많이 사용

  • 헤더 정보가 필요하면 HttpEntity를 사용하거나 @RequestHeader를 사용

JSON

  • HTTP API에서 주로 사용하는 데이터 형식
  • ObjectMapper를 사용

01. InputStream 사용

02. @RequestBody, @ResponseBody 사용

  • @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";
    }
    

03. @ResquestBody + 객체 파라미터

  • @ResponseBody
    @PostMapping("/request-body-json-v3")
    public String requestBodyJsonV3(@RequestBody HelloData helloData){
        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
        return helloData;
    }
    
  • HTTP message Converter가 JSON을 자동으로 객체로 변환해줌 (ObjectMapper 대신 처리)

  • 이 때, @RequestBody를 생략할 수 없음

    • 생략 시, @ModelAttribute가 적용됨 => HTTP 메세지 바디가 아님
    • => 요청 파라미터를 찾아버린다 => 기본값으로 나옴
  • Client측의 Accept: application/json이 헤더에 적용되어 있는 경우, JSON으로 내보낼 수도 있음

04. HTTP Entity를 사용해도 됨



인프런 - 김영한님의 Spring MVC 강의를 정리한 내용입니다.


김영한님 인프런 강의

댓글남기기