Jan 10, 2023
6 mins read
Servlet 2에 이어 HTTP 요청 메시지를 클라이언트에서 서버로 전달하는데 사용하는 방식 3가지에 대해 알아보자. (인프런 강의 듣는 중)
package hello.servlet.basic.request;
import java.io.IOException;
import java.util.Enumeration;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
/*
* 1.파라미터 전송 기능
* http://localhost:8080/requetst-param?username=aroong&age=20
* */
@WebServlet(name = "requestParamServlet", urlPatterns = "/requetst-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("RequestParamServlet.service");
//Enumeration<String> parameterNames = request.getParameterNames();
System.out.println("[전체 파라미터 조회] - start");
request.getParameterNames().asIterator().forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));
System.out.println("[전체 파라미터 조회] - end");
System.out.println();
System.out.println("[단일 파라미터 조회]");
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("username = " + username);
System.out.println("age = " + age);
System.out.println("[이름이 같은 복수 파라미터 조회]"); //중복되게 사용하진 않지만 가져오는 기능이 있긴하다.
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
response.getWriter().write("ok");
}
}
http://localhost:8080/requetst-param?username=aroong&age=20&username=aroongeee
[전체 파라미터 조회] - start
username=aroong
age=20
[전체 파라미터 조회] - end
[단일 파라미터 조회]
username = aroong
age = 20
[이름이 같은 복수 파라미터 조회]
username = aroong
username = aroongeee
HTML FORM 태그를 통해 HTTP 요청하는 방식.
content-type이 있어야 함. ex) content-type: application/x-www-form-urlencoded
메시지 바디에 쿼리 파라미터 형식 ex) username=aroong&age=20
으로 데이터를 전달한다.
webapp > basic 폴더를 만들고 POST 요청 용 html을 하나 만든다.
http://localhost:8080/basic/hello-form.html
<form action="/request-param" method="post">
브라우저에서 username, age에 값을 넣고 전송을 누르면 결과가 GET 파라미터 보냈을때와 같이 나오는걸 볼 수 있다.
HTTP API에서 주로 사용되며 JSON이 보편적이다.
JSON message body를 테스트 하기위해 우선 hello.servlet.basic 밑에 JSON 데이터 객체용 클래스 HelloData를 하나 생성한다.
package hello.servlet.basic;
import lombok.Getter;
import lombok.Setter;
//lombok 사용
@Getter @Setter
public class HelloData {
private String username;
private String age;
/*
* lombok을 사용하여 아래 코드가 없이 Getter, Setter사용
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
*/
}
package hello.servlet.basic.request;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.springframework.util.StreamUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet{
//스프링 부트에서 JSON 데이터 바인딩해 줄 jackson 기능
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("message = " + messageBody);
//request data -> HelloData.class
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
response.getWriter().write("ok");
}
}
message = {"username":"aroong","age":20}
helloData.username = aroong
helloData.age = 20