HttpServletRequest, HttpServletResponse
HTTP요청메시지, HTTP응답 메시지를 편리하게 사용하도록 도와주는 객체.
서블릿이 개발자 대신에 HTTP요청 메시지를 파싱해서 HttpServletRequest객체에 담아서 제공하기 때문에 개발자는 그냥 사용하면 된다.
🔸 GET/POST 방식확인
request.getMethod(); //GET
🔸 사용 프로토콜
request.getProtocol(); // HTTP/1.1
🔸 http, https, ftp
request.getScheme(); //http
🔸 URL주소가져오기
request.getRequestURL();// http://localhost:8080/request-header request.getRequestURI(); // /request-header
🔸 QueryString 얻기
request.getQueryString(); // username=hello
🔸 https(보안채널)사용유무
request.isSecure();
🔸 헤더정보
/*Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); System.out.println(headerName + ": " + request.getHeader(headerName)); } */ request.getHeaderNames().asIterator(). forEachRemaining(headerName -> System.out.println(headerName + ": "+ request.getHeader(headerName)));
🔸 쿠키정보
if (request.getCookies() != null) { for (Cookie cookie : request.getCookies()) { System.out.println(cookie.getName() + ": " + cookie.getValue()); } }
🔸 서버 정보(이름, 포트)
request.getServerName(); request.getServerPort();
🔸 local 정보
request.getLocalName(); request.getLocalAddr(); request.getLocalPort();
🔸 Remote 정보
request.getRemoteHost(); request.getRemoteAddr(); request.getRemotePort();
HTTP요청의 시작~종료까지 유지되는 임시저장소 기능
request.setAttribute(name, value);
request.getAttribute(name);
request.getSession(create:true);
GET, POST, HTTP message body
🔸 GET - 쿼리 파라미터
- /url?username=hi&age=20
- 메시지 바디 없이 url의 쿼리파라미터에 데이터를 포함해서 전달
- 검색, 필터, 페이지 등에서 많이 사용
🔸데이터 전달 방법
localhost:8080/request-param?username=hi&age=10
🔸 전달된 데이터 가져와서 사용하기
// 단일 파라미터 String age = request.getParameter("age"); String username = request.getParameter("username"); // 파라미터 이름을 모두 조회 Enumeration<String> parameterNames = request.getParameterNames(); //요즘 방식 request.getParameterNames().asIterator() .forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName))); // 파라미터를 Map으로 조회 Map<String, String[]> parameterMap = request.getParameterMap(); // 이름이 같은 복수의 파라미터를 조회 String[] usernames = request.getParameterValues("username"); for(String username : usernames){ System.out.println("username = " + name);
🔸 POST - HTML Form
- Content-Type:application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파라미터 형식으로 데이터 전달 ➡️username=hi&age=20
- 회원가입, 상품주문, HTML FORM사용
🔸 데이터 전달 방법
<!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>
🔸 데이터 가져와서 사용하는 방법은 위의 GET방법과 동일
🔸 테스트 할 때마다 form 만들기는 귀찮으니깐 POSTMAN을 사용하자.
🔸 HTTP message body
- HTTP API에서 주로 사용 (JSON, XML, TEXT정보를 담아서 데이터 전달)
- 데이터 형식은 주로 JSON형식을 사용
- POST, PUT, PATCH
🔸 데이터 전달 방법(TEXT)
post : http://localhost:8080/request-body-string
contentType : text/plain
message body : hello!
🔸 데이터 가져와서 사용하기@WebServlet(name="requestBodyStringServlet", urlPatterns="/request-body-string") public class RequestBodyStringServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletInputStream inputStream = request.getInputStream();// inputStream은 바이트 코드를 반환 String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // StreamUtils를 이용해서 바이트코드를 String으로 변환 System.out.println("messageBody = " + messageBody); response.getWriter().write("OK");
🔸 데이터 전달방법(JSON)
post : http://localhost:8080/request-json-string
contentType : json
message body : {"username":"hello", "age":20}
🔸 데이터 가져와서 사용하기@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 messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); System.out.println("messageBody = " + messageBody); HelloData helloData = objectMapper.readValue(messageBody, HelloData.class); System.out.println("helloData.getUsername = " + helloData.getUsername()); System.out.println("helloData.getAge = " + helloData.getAge()); response.getWriter().write("OK"); } }