Servlet 3 - HTTP 요청 방식

Jan 10, 2023

6 mins read

Servlet 2에 이어 HTTP 요청 메시지를 클라이언트에서 서버로 전달하는데 사용하는 방식 3가지에 대해 알아보자. (인프런 강의 듣는 중)

[HTTP 요청 데이터 3가지 방법]

  • GET - 쿼리 파라미터
  • POST - HTML Form
  • HTTP message body (API)

1. GET - 쿼리 파라미터

  • hello.servlet.basic.reques 아래 RequestParamServlet 서블릿을 생성하고 브라우저에서 GET으로 요청한다.
    (이클립스 프로젝트는 Servlet 1,2 에서 이어짐)
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
  • GET 쿼리 파라미터 요청 응답 로그
[전체 파라미터 조회] - start
username=aroong
age=20
[전체 파라미터 조회] - end

[단일 파라미터 조회]
username = aroong
age = 20
[이름이 같은 복수 파라미터 조회]
username = aroong
username = aroongeee

2. POST - HTML Form

  • HTML FORM 태그를 통해 HTTP 요청하는 방식.
    content-type이 있어야 함. ex) content-type: application/x-www-form-urlencoded
    메시지 바디에 쿼리 파라미터 형식 ex) username=aroong&age=20 으로 데이터를 전달한다.

  • webapp > basic 폴더를 만들고 POST 요청 용 html을 하나 만든다.

post_html_form

  • 브라우저에서 접속. http://localhost:8080/basic/hello-form.html

post_html

  • form 태그의 action이 위에서 만들어둔 /request-param 서블릿을 호출했기 때문에
<form action="/request-param" method="post">

브라우저에서 username, age에 값을 넣고 전송을 누르면 결과가 GET 파라미터 보냈을때와 같이 나오는걸 볼 수 있다.

3. HTTP message body (API)

  • 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;
	}
	*/
}
  • hello.servlet.basic.request 에는 JSON용 서블릿 RequestBodyJsonServlet을 만들어준다.
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");
	}
	
}
  • Postman으로 JSON데이터를 보내본다.

postman_json_req

  • 로그가 잘 찍히는 걸 볼 수 있다.
message = {"username":"aroong","age":20}
helloData.username = aroong
helloData.age = 20