HttpServletRequest와 HTTP 요청 데이터
07 Aug 2023스프링 MVC 1편 강의 정리
HTTP 요청 데이터
- GET - 쿼리 파라미터
- /url?username=tom&age=20
- URL의 쿼리 파라미터에 데이터를 포함해서 전달
- 검색, 필터, 페이징 등에서 많이 사용하는 방식
- POST - HTML form
- username=tom&age=20
content-type: application/x-www-form-urnencoded
- 메세지 바디에 쿼리 파라미터 형식으로 전달
- 회원가입, 상품 주문 등에서 사용
- HTTP message body
- HTTP API에서 주로 사용
- JSON, XML, TEXT
- POST, PUT, PATCH 메서드 사용
GET query parameter
- 메세지 바디 없이 URL의 쿼리 파라미터 사용해서 데이터 전달
- 쿼리 파라미터는
?
로 시작하며 추가 파라미터는&
로 구분 - 서버에서는
HttpServletRequest
가 제공하는 메서드로 조회 가능- getParameter: 단일 파라미터 조회
- getParameterNames: 파라미터 이름 모두 조회
- getParameterMap: 파라미터 map으로 조회
- getParameterValues: 복수 파라미터 조회
- getParameter는 하나의 파라미터가 값이 하나일 때만 사용하며, 값이 여러개일 경우 첫번째 값 반환
String username = request.getParameter("username");
Enumeratation<String> parameterNames = request.getParameterNames();
Map<String, String[]> parameterMap = request.getParameterMap();
String[] usernames = request.getParameterValues("username")
POST html form
- content-type:
application/x-www-form-urlencoded
- content-type은 HTTP 메세지 바디의 데이터 형식 지정
- GET 메서드의 쿼리 파라미터 형식과 동일
- 쿼리 파라미터 조회 메서드 사용 가능
- 메세지 바디에 쿼리 파라미터 형식으로 데이터 전달
API message body
- HTTP 메세지 바디에 데이터 직접 담아서 요청
- JSON, XML, TEXT 형식
- POST, PUT, PATCH 메서드에서 사용
@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// byte code로 받음
ServletInputStream inputStream = req.getInputStream();
String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("body = " + body);
}
}
JSON 형식
POST
http://sample.com/test- content-type: application/json
- message body: `{“username”: “tom”, “age”: 42}
- Spring MVC에서는 아래의 과정을 추상화해서 편리하게 사용할 수 있도록 제공함
@Data
public class HelloData {
private String username;
private int age;
}
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("body = " + body);
// body = {"username": "tom", "age": 42}
HelloData helloData = objectMapper.readValue(body, HelloData.class);
System.out.println("helloData = " + helloData);
// helloData = HelloData(username=tom, age=42)
response.getWriter().write("200 OK");
}
}