HttpRequest의 데이터 전달 방법

Hansu Kim·2022년 4월 7일
0

Spring MVC

목록 보기
2/6

HttpRequest 메시지의 내용

  POST /save HTTP/1.1
  Host: localhost:8080
  Content-Type: application/x-www-form-urlencoded
  username=kim&age=20
  • START LINE
    • HTTP 메소드
    • URL
    • 쿼리 스트링
    • 스키마, 프로토콜
  • 헤더
    • 헤더 조회
  • 바디
    • form 파라미터 형식 조회
    • message body 데이터 직접 조회

위는 간단한 예시이며, 실제로는 훨씬 더 많은 다양한 정보가 포함된다.

HttpServletRequest 객체의 메소드 예시

request.getMethod() = GET
request.getProtocal() = HTTP/1.1
request.getScheme() = http
request.getRequestURL() = http://localhost:8080/request-header
request.getRequestURI() = /request-header
request.getQueryString() = null
request.isSecure() = false

HttpRequest를 통해 데이터를 전달하는 방법

GET 방식의 Query Parameter

  • URL 뒤에 "?name=hansu&addr=seoul" 방식으로 전달
  • message body 없이 URL 쿼리 파라미터에 데이터 전달
  • header의 content-type이 null
    ex) 검색, 필터, 페이징

    HttpServletRequest.getParameter는 동일한 이름의 파라미터가 여러개일 경우, 첫번째 파라미터의 값을 반환해준다.
    중복된 파라미터명이 존재할 수 있을 경우, getParameterValues() 와 asIterator(), forEachRemaining()을 활용하도록 하자

POST 방식의 HTML Form

  • Header의 content-type이 application/x-www-form-urlencoded
  • message body에 쿼리 파라미터 형식으로 전달 name=hansu&addr=seoul
  • GET의 Query Parameter 방식과 포맷이 같기 때문에 HttpServletRequest.getParameter 를 통해 똑같이 접근할 수 있다.
    ex) 회원 가입, 상품 주문 등 HTML Form 사용해 작성된 데이터

    html 예시 코드

    <form action="/save" method="post">
      <input type="text" name="name" />
      <input type="text" name="addr" />
      <button type="submit">전송</button>
    </form>

    html 메시지

    POST /save HTTP/1.1
    Host: localhost:8080
    Content=Type: application/x-www-form-urlencoded
    name=hansu&addr=seoul

message body 활용

  • HTTP API에서 주로 사용. (Json, XML, text)
  • 데이터는 주로 Json
  • message body 사용시 HTTP Method는 POST, PUT, PATCH 사용
  • HTTP Message Body의 데이터는 InputStream으로 직접 읽을 수 있다.
    ServletInputStream inputStream = req.getInputStream();
    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
     
    System.out.println("messageBody = " + messageBody);

Message body로 JSON 데이터가 넘어올 때의 처리 예시

@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletInputStream inputStream = req.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("messageBody = " + messageBody);
        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

        System.out.println("helloData.username = " + helloData.getUsername());
        System.out.println("helloData.age = " + helloData.getAge());
    }
}
  • ObjectMapper를 사용하여, Request Message Body의 Json 데이터를 바로 객체로 변환해줄 수 있다.
    • json 데이터들의 키값이 객체의 멤버 변수명과 완전 일치하지 않으면 500 응답값 반환됨

ObjectMapper는 Spring MVC에서 제공해주는 Jackson 라이브러리의 기능이다.

0개의 댓글