Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

HTTP 요청 메시지 - 단순 텍스트 본문

인프런/[인프런] 스프링 MVC 1

HTTP 요청 메시지 - 단순 텍스트

Seung__ 2021. 9. 14. 23:14

1.HTTP message Body에 데이터를 직접 담아서 요청할 수 있음.


  • HTTP API에서 주로 사용, JSON, XML, TEXT
  • JSON 형식
  • POST, PUT, PATCH
  • 요청 파라미터와 다르게 HTTP 메시지 바디에 데이터를 답아서 넘어오면
  • @RequestParam, @ModelAttribute를 사용할 수 없다.
    (단, HTML Form형식은 메시지 바디에 쿼리 파라미터 형태임 ㅋㅋ)

 

2. messageBody의 텍스트 꺼내기.


  • inputStream 받기 : request.getInputStream()
  • Stream을 String으로 바꾸기
    • StreamUtils에서 제공하는 copyToString()사용, 
    • stream은 바이트코드로 바이트코드를 문자로 변경할 때는 인코딩 방식 지정 필요.
   @PostMapping("/request-body-string-v1")
    public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //stream은 바이트 코드
        ServletInputStream inputStream = request.getInputStream();
        //바이트 코드를 문자로 받을 경우 인코딩을 어떻게? ㅋㅋㅋ
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        log.info("messageBody = {}", messageBody);
        
        response.getWriter().write("ok");
    }

 

 

 

3. InputStream, Writer 직접 받기.


  • Servlet에 대한 코드는 필요 없다. 
  • InputStream, Writer를 직접 받을 수 있다.
  • .getInputStream(), .getWriter()가 생략된다.
    @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");
    }

 

 

 

4. HTTP MessagConverter, HttpEntity<T>


  • StreamUtils를 활용해서 inputStream을 String으로 바꾸기 귀찮음...
  • HttpEntity<T>를 사용하면 타입에 따라 Http Body의 데이터를 변환해줌
  • 예를들어 HttpEntity<String> 을 받으면 body에 있는 데이터를 String으로 변환해서 받음.
  • Response의 경우 새로운 HttpEntity 객체를 생성해서 body에 원하는 data 넣으면 됨 ㅋㅋㅋ
    @PostMapping("/request-body-string-v3")
    public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {

        String body = httpEntity.getBody();

        log.info("messageBody = {}", body);

        return new HttpEntity<>("ok");
    }

 

 

 

5. HttpEntity, RequestEntity


  • HttpEntity: HTTP header, body 정보를 편리하게 조회
    • 메시지 바디 정보를 직접 조회
    • 요청 파라미터를 조회하는 기능과 관계 없음 @RequestParam X, @ModelAttribute X
    • 요청 파라미터 ->Get으로 쿼리 파라미터 넘어오는거 or HTML Form
  • HttpEntity는 응답에도 사용 가능
    • 메시지 바디 정보 직접 반환 -> new HttpEntity<>(body)
    • 헤더 정보 포함 가능
    • view를 조회하지 않음 -> Http 응답 메시지 body에 데이터 넣어서 보내버림.
  • HttpEntity 를 상속받은 다음 객체들도 같은 기능을 제공한다.
  • RequestEntity
    • HttpMethod, url 정보가 추가, 요청에서 사용
  • ResponseEntity
    • HTTP 상태 코드 설정 가능, 응답에서 사용
    • return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED)
    @PostMapping("/request-body-string-v3")
    public HttpEntity<String> requestBodyStringV3(RequestEntity<String> httpEntity) throws IOException {

        String body = httpEntity.getBody();

        log.info("messageBody = {}", body);

        return new ResponseEntity<String>("ok", HttpStatus.OK);
    }

 

6. @RequestBody, @ResponseBody


  • HttpEntity 사용하기 귀찮은데....???
  • @RequestBody
    • @RequestBody annotation을 사용하면
    • Http 요청 message의 body를 꺼내서 String으로 바꿔줌 ㅋㅋㅋㅋㅋㅋㅋ
  • @ReponseBody
    • @ReponseBody  annotatoin을 사용할 경우
    • 반환되는 String을 응답 message body에 넣어줌 ㅋㅋㅋ
    @ResponseBody
    @PostMapping("/request-body-string-v4")
    public String requestBodyStringV4(@RequestBody String messageBody) throws IOException {

        log.info("messageBody = {}", messageBody);

        return "ok";
    }

 

7. 요청 파라미터 vs HTTP 메시지 바디


  • 요청 파라미터 조회  : @RequestParam, @ModelAttribute
    • GET으로 넘어오는 쿼리 파라미터, HTML Form
  • HTTP 메시지 body 직접 조회 : @RequestBody

 

 

8. GitHub : 210914 @RequestBody, @ResponseBody


 

GitHub - bsh6463/MVC2

Contribute to bsh6463/MVC2 development by creating an account on GitHub.

github.com

 

Comments