Free Lines Arrow
본문 바로가기
Spring/spring framework 구현 스터디

[Spring] Servlet 다루기 2: HttpServletRequest 예제

by p8labs 2021. 10. 10.
728x90
반응형

HTTP 요청데이터

 어떻게 클라이언트에서 서버로 HTTP 요청 메시지를 통해 데이터를 전달 할까?

 

 

주로 3가지 방법이 있다.

Get 방식 쿼리 파라미터.

  • 보통 우리가 네이버를 검색할때 나가는 url 을 생각 하면될것 같다.
  • naver 에서 강아지라고 검색하면 url이 다음과같이 변경된다.
    ? 부터가 쿼리의 시작이다.
https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EA%B0%95%EC%95%84%EC%A7%80
  • 바디없이 쿼리파라미터에 데이터를 담아 전달한다.
  • 예) 조회, 필터 등

 

 

Post - HTML Form

  • 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&hobby=drum
  • content type:
      - content-type:application/x-www-form-urlencoded
  • 예) 회원 가입, 상품 주문, HTML Form 사용시

 

 

HTTP message body에 데이터를 직접 담아서 요청한다.

  • HTTP API에서 주로 사용 JSON, XML, TEXT
  • 데이터 형식은 주로 JSON사용
     - POST, PUT, PATCH

 

 

POST 예제- HTML 예제

 

 

 

 

 

Get 방식 쿼리 파라미터 예제

  • 메시지 바디 없이, URL의 쿼리 파라미터를 사용해서 데이터를 전달한다.
  • Get 파라미터는 다음과 같이 조회 할 수 있다.
  • getParameternames() 함수를 사용
    request.getParameterNames()
           .asIterator()
           .forEachRemaining(paraName-> System.out.println(paraName +"="+ request.getParameter(paraName)));​
  • 단일 파라미터 조회
    String username = request.getParameter("username"); //단일 파라미터 조회​
  • 파라미터 Map 으로조회
    Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map​
  • 복수로 들어오는 경우가 있을때는 어떻게 해결을 해야될까?
     - 아래와 같이 username이 2번 입력 되었을때
     - http://localhost:8080/request-param?username=skahn&hobby=drum&username=skahn2
    String []usernames =  request.getParameterValues("username");
    for (String name : usernames) {
        System.out.println("username" + name);
    }​
    - 복수로 들어오는 경우에는 getParameterValues 함수를 사용해야 된다.
    - gerParameter() 를 사용하게 되면 첫번째 값을 반환한다.

 

 

Post - HTML Form 예제

HTML form 을 사용하여 데이터를 전송한다.

 

특징

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다.
     - username=hello&hobby=drum
  • html 생성후 전송 버튼을 누르면 아래 서블릿으로 넘어간다.

 

html

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<form action="/request-param" method="post">
 username: <input type="text" name="username" />
 age: <input type="text" name="age" />
 <button type="submit">전송</button>
</form>
</body>
</html>

 

서블릿

package hello.servlet.basic.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * 1. 파라미터 전송기능
 * http://localhost:8080/request-param?username=skahn&hobby=drum
 */
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("Search all parameter - start");

        request.getParameterNames()
                .asIterator()
                .forEachRemaining(paraName-> System.out.println(paraName +"="+ request.getParameter(paraName)));

        System.out.println("Search all parameter - end");
        System.out.println();

        System.out.println("Search single parameter - start");
        String username = request.getParameter("username");
        String hobby = request.getParameter("hobby");

        System.out.println("username: "+username);
        System.out.println("hobby: "+hobby);

        System.out.println("조회 single parameter - end");

        System.out.println("복수 조회 - start");
        String []usernames =  request.getParameterValues("username");
        for (String name : usernames) {
            System.out.println("user name " + name);
        }

        response.getWriter().write("OK");
    }
}

 

 

 

HTTP 요청데이터 - API 메시지 바디

 

단순텍스트

  • Http message body에 데이터를 직접 담아서 요청
  • HTTP API 에서 사용한다 현재는JSON 으로 거의다 보낸다.
  • POST, PUT, PATCH

 

  • body에 text로 요청이 왔을경우
  • request 에서 inputstream을 가져온뒤
  • StreamUtils.copyToString(inputstream, encoding) 함수로 text 를 가져올수 있다.
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletInputStream inputStream = req.getInputStream();// body의 내용을 바로 byte code 로 가져온다.
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // 인코딩을 지정해줘야한다.

        System.out.println("messageBody = " + messageBody);

        resp.getWriter().write("OK");
    }

 

 

JSON 형식

  • JSON 형태로 데이터를 전송
  • content-type:
     - content-type: application/json
  • 다음과 같이 json 을 만든다.
     - {"username": "hello", "hobby": "drum"}
  • json 형식을 클래스로 담아본다.

HelloData class

import lombok.Setter;
@Getter @Setter
public class HelloData {
 private String username;
 private int age;
}

 

  • 요청된 JSON 형태의 데이터를 클래스로 변환하기 위해서는
  • ObjectorMapper 가 필요하다.
@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);
        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
        System.out.println("helloData = " + helloData.getUsername());
        System.out.println("helloData = " + helloData.getHobby());

        resp.getWriter().write("OK");
    }
}

 

 

참고

  • JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리를
    추가 해야 되지만 스프링에는 기본적으로 제공해준다.

 

728x90
반응형

댓글