[Java]Servlet을 이용한 Http request

재피터노트북·2022년 10월 6일
0

Http Servlet Request

  • Servlet은 개발자가 Http요청 메세지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP요청 메세지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.

HTTP 요청 방법

  • GET - 쿼리 파라미터

    • /uri?username=lee&age=26
    • 메세지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달.
    • 검색, 필터등에서 많이 사용함.
  • POST - HTML Form

    • username=lee&age=26
    • 메세지 바디에 쿼리 파라미터 형식으로 전달
  • Http message body

    • HTTP API에서 주로사용
    • 주로 JSON형식으로 주고받음.

HTTP GET 쿼리 파라미터

package hello.servlet.basic.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

// 1. 파라미터 전송기능


@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class ReqiestParamServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        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();

        System.out.println("[이름이 같은 복수 파라미터 조회]");
        String[] usernames = request.getParameterValues("username");
        for (String name : usernames) {
            System.out.println("username = " + name);
        }

        response.getWriter().write("ok");
    }
 }

request 요청 : localhost:8080/request-param?username=lee&age=26

  • request-param으로 요청이 들어오면 밑의 함수가 실행이 된다.
  • getParameter함수를 이용해 각 파라미터별 값을 조회할수 있다.
  • 복수파라미터 같은 경우는 getParameterValues로 해당 key값으로 조회 할수 있다.
  • 출력 결과

[전체 파라미터 조회] - start
username=hello
age=20
[전체 파라미터 조회] - end
[단일 파라미터 조회] 
username = lee 
age = 26
[이름이 같은 복수 파라미터 조회] 
username=lee

HTTP POST HTML Form

  • post man request body

username=lee&age=26
  • requestbodyString

package hello.servlet.basic.request;

import org.springframework.util.StreamUtils;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

@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();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("messageBody = " + messageBody);

        response.getWriter().write("ok");
    }
}
  • post man의 요청 데이터타입을application/x-www-form-urlencoded 으로 지정해주고 그안에 데이터를 입력하고 Post방식으로 보내면 html폼데이터에서 보낸거하고 똑같이 전송된다.

  • inputStream은 byte코드를 반환한다. 그래서 지정해줬다.

출력 결과

messaagebody = username=lee&age=26

HTTP API 메세지 바디 - JSON

  • Data

package hello.servlet.basic;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class HelloData {
    private String username;
    private int age;
}
  • requestBodyJson

@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());

    }
}
  • form이랑 방식은 똑같은데 post man으로 전송방식을 application/josn으로 설정해주고 데이터를 보냄.

출력결과

{
	username : lee
    age : 26
}
profile
난 이 재 선

1개의 댓글

comment-user-thumbnail
2022년 10월 13일

와~ 서블렛 방식 설명해주세요! 직접 들어보고 싶네요

답글 달기