HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달할 수 있는 방법에 대해 공부한다.
GET-쿼리 파라미터
# 개요
- /url?username=hello&age=20
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
예) 검색, 필터, 페이징등에서 많이 사용하는 방식
# 전체 파라미터 조회(getParameterNames)
- asIterator(): 이 열거에 포함 된 요소들을 순회 하는 Iterator를 리턴한다. 컬렉션에 저장되어 있는 요소를 다 꺼내 올 때까지 도는 것
- forEachRemaining(): Iterator를 ArrayList로 변환해준다.
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));
}
}
# 단일 파라미터 조회(getParameter)
하나의 파라미터 이름에 대해 하나의 값만 있을 경우 사용
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String age = request.getParameter("age");
}
# 이름이 같은 복수 파라미터 조회(getParameterValues)
중복일 때 getParameter을 호출하면 첫 번째 값 반환
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
}
POST - HTML Form
# 개요
- 클라이언트 → 서버로 데이터를 전송
- content-type이 application/x-www-form-urlencoded이라면 HTML Form을 통해 전달된 정보라는 의미이다.
- 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
예) 회원 가입, 상품 주문, HTML Form 사용
# 실습
basic 디렉터리의 hello.html을 추가한다. (action: "/request-param" 서블릿으로 POST 요청)
<!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 방식과 동일한 쿼리 파라미터 조회 메서드를 그대로 사용한다. 즉 request.getParameter()은 GET URL 쿼리 파라미터 형식도 지원하고, POST HTML Form 형식도 지원한다.
HTTP API 방식
# 개요
- HTTP Message Body에 직접 데이터를 넣어서 전달 (JSON, XML, TEXT)
- 데이터 형식은 주로 JSON 사용 (POST, PUT, PATCH)
# 바디 내용 수신(TEXT)
getInputStream()으로 바디 내용을 Byte 코드로 수신한 다음에, StreamUtils.copyToString()을 통해 String으로 변환
@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();
// Byte -> String
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
response.getWriter().write("ok!!");
}
}
# JSON
- Content-Type: application/json
우선 JSON 데이터를 파싱할 수 있게 객체로 변환하는 코드를 작성한다.
package hello.servlet.basic;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
아래 설정만 한다면 긴 Getter Setter 코드를 어노테이션으로 설정할 수 있다.
json을 처리하는 servlet은 위와 같지만, 이제 Json으로 나온 데이터를 사전에 만들어놓은 HelloData 객체로 파싱해줘야 한다.
기본적으로 제공되는 Jackson 라이브러리의 ObjectMapper.readValue(messageBody, 객체이름.class)으로 파싱한다.
@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);
objectMapper.readValue(messageBody, HelloData.class);
}
}
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'🌱 Spring > MVC ①' 카테고리의 다른 글
[Spring] 회원 관리 웹 어플리케이션 1 _ Domain/Repo/Test (0) | 2023.07.12 |
---|---|
[Spring] HTTP 응답 데이터(HttpServletResponse) (0) | 2023.07.12 |
[Spring] HttpServletRequest 기능과 정보 (0) | 2023.07.11 |
[Spring] Servlet 구현 (0) | 2023.07.11 |
[Spring] 동시 요청을 위한 멀티 스레드 (0) | 2023.07.10 |