티스토리 뷰
1. GET방식 - 쿼리 파라미터
- URL의 쿼리 파라미터에 데이터를 포함해서 전달
- 검색이나 필터, 페이징등에서 많이 사용함
- ex) http://localhost:8080/request-param?username=zoooo&age=500
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;
import java.util.Enumeration;
import java.util.Iterator;
///1. 파라미터 전송기능
/// http://localhost:8080/request-param?username=hello&age=20
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//모든파라미터 꺼냄
System.out.println("===== 전체파라미터 조회 =====");
// Enumeration<String> parameterNames = request.getParameterNames();
// while (parameterNames.hasMoreElements()) {
// String paramName = parameterNames.nextElement();
// System.out.println(paramName + "=" +
// request.getParameter(paramName));
// }
///요즘방법
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName +"="+ request.getParameter(paramName)));
System.out.println("===== 전체파라미터 조회 끝=====");
System.out.println("");
//// 단일로 꺼내기
System.out.println("===== 단일 파라미터 조회 =====");
String username = request.getParameter("username");
System.out.println("username : " +username);
String age = request.getParameter("age");
System.out.println("age : " +age);
System.out.println("===== 단일 파라미터 조회 끝=====");
}
}
http://localhost:8080/request-param?username=이주연&age=24 쿼리 날렸을때
- 전체 파라미터 조회 : request.getParameterNames();
- 단일 파라미터 조회 : reQuest.getParameter("name");
System.out.println("===== 이름이 같은 복수 파라미터 조회=====");
String[] usernames = request.getParameterValues("username");
for (String s : usernames) {
System.out.println("username = " + s);
}
System.out.println("===== 이름이 같은 복수 파라미터 조회 끝=====");
response.getWriter().write("ok");
- 이름이 같은 파라미터가 여러개 있을때 : request.getParameterValues("name");
예시)
http://localhost:8080/request-param?username=이주연&age=500&username=이현재&username=김영훈
쿼리 날렸을때
- 애초에 중복으로 날리는 경우가 잘 없다
- request.getParameter()는 하나의 파라미터 이름에 대해서 단 하나의 값만 있을때 사용해야함
- 중복일때는 request.getParameterValues()
- 참고로 이렇게 중복일때 request.getParameter()를 사용하면 request.getParameterValues()의 첫번째 값을 반환한다
2. POST 방식 - HTML form
- 주로 회원가입, 주문 등등에서 사용
hello-form.html
<!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>
- /request-param으로 가는 html form 작성
- 요청 URL : http://localhost:8080/request-param
- content-type: application/x-www-form-urlencoded
- message body: username=이주연&age=24
전송버튼 누르고 개발자 모드 실행했을 때
콘솔창
- action이 get파라미터 던졌을때랑 같은 urlPatterns이라 같은내용 찍힘
3. HTTP message body에 담아서 전송
- HTTP API에서 주로 사용(JSON, XML, TEXT)
- 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
주로 쓰는 JSON형식으로 전달하는 예제
HelloData.java
package hello.servlet.basic;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
// public String getUsername() {
// return username;
// }
//
// public void setUsername(String username) {
// this.username = username;
// }
//
// public int getAge() {
// return age;
// }
//
// public void setAge(int age) {
// this.age = age;
// }
}
- JSON형식으로 파싱가능하도록 객체 생성
- 원래였으면 getter,setter 다 생성해야지만, lombok사용해서 @Getter @Setter만 적어주면 됨
RequestBodyJsonServlet.java
package hello.servlet.basic.request;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
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 = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
//스프링부트에서 기본적으로 제공해주는 json라이브러리
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String message = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("message " + message);
HelloData helloData = objectMapper.readValue(message, HelloData.class);
///객체로 변환
System.out.println("helloData.username : "+helloData.getUsername());
System.out.println("helloData.userage : "+helloData.getAge());
response.getWriter().write("!!!!");
}
}
- JSON형식의 결과를 파싱할수 있는 객체로 변화하려면 Jackson, Gson같은 JSON변환 라이브러리를 추가해야함
- 스프링 부트에서는 Jackson 라이브러리(ObjectMapper)를 기본적으로 제공 -> 파싱하기 쉬워진다
Postman을 사용해서 테스트
'Network' 카테고리의 다른 글
[CS 공부] 넓고 얕게 외워서 컴공 전공자 되기 (0) | 2024.06.14 |
---|---|
HTTP 응답 데이터(HttpServletResponse) - 단순 텍스트, HTML, HTTP API JSON (0) | 2021.04.21 |
서블릿 등록, HttpServletRequest 기본 기능들 (0) | 2021.04.11 |
- Total
- Today
- Yesterday