HTTP 요청 메세지를 직접 파싱하기에는 너무 불편하다.
서블릿이 HTTP 요청메시지를 파싱하고 그 결과를 HttpServletRequest
객체에 담아서 제공한다.
HttpServletRequest
객체를 다음과 같이 활용 가능하다.
- START LINE
- HTTP 메소드
- URL
- 쿼리 스트링
- 스키마, 프로토콜
- 헤더
- 헤더 정보
- 바디
- form(xxxurlencoded) 데이터 조회
- message body 데이터 직접 조회
HttpServletRequest 객체는 요청이 오고 응답이 나갈 때까지가 생명주기다.
HTTP 요청 시작부터 끝날 때까지 유지되는 임시 저장소 기능을 제공한다.
request.setAttribute(name, value)
request.getAttribute(name)
request.getSession()
클라이언트에서 HTTP 요청 메세지를 통해서 데이터를 서버로 보내는 방법은 주로 3가지가 있다.
- GET 요청 - 쿼리 파라미터
- 검색, 필터, 페이징 등에서 많이 사용
- POST 요청 - HTML Form을 통해 데이터 전송
- content-type: application/x-www-form-urlencoded
- HTTP message body에 데이터를 담아서 요청
- POST, PUT, PATCH 요청에 사용
- REST API에서 주로 사용, JSON 형식 데이터를 주로 사용
String username = request.getParameter("username");
//단일 파라미터 조회
Enumeration<String> parameterNames = request.getParameterNames();
//파라미터 이름들 모두 조회
Map<String, String[]> parameterMap = request.getParameterMap();
//파라미터를 Map으로 조회
String[] usernames = request.getParameterValues("username");
//복수 파라미터 조회
⚠️참고 동일한 파라미터를 여러 번 사용 가능
?username=hello&username=spring
이렇게 중복일 때는 복수 파라미터 조회를 하지 않고 단일 파라미터 조회를 할 때 첫 번째 파라미터 값이 나온다.
content-type:
application:x-www-form-urlencoded
클라이언트에서 메세지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다
쿼리 파라미터 조회 방식과 똑같은 방식으로 조회 가능
(파라미터 조회 메서드 그대로 사용 가능, 데이터 형식이 동일해서 가능하다)
html form 엘리먼트에서 submit이 일어나면
content-type: application:x-www-form-urlencoded
메세지 바디는 쿼리 파라미터 형식(ex. username=spring&age=20)으로 작성하여 POST 요청을 서버로 보낸다.
InputStream을 사용해서 HTTP message body 데이터를 직접 읽을 수 있다.
지금은content-type: text/plain
으로 설정해서 postman을 통해 요청을 전송
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
앞에서는 단순 텍스트를 message body에 담아서 넘겼지만
이번에는 JSON 문자열을 message body에 담아서 서버에 요청한다.
content-type: application/json
HelloData helloData = objectMapper.readValue(messageBody,
HelloData.class);
앞에서처럼 message body 데이터를 직접 읽은 작업 후에, json 문자열을 자바 객체로 변환하기 위해 Jackson 라이브러리(ObjectMapper
) 사용
Gson
을 사용해도 된다. 스프링 부트로 Spring MVC를 선택하면 기본으로 Jackson 라이브러리를 제공한다.