HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법 3가지
- GET - 쿼리 파라미터
- POST - HTML Form
- HTTP message body에 데이터를 직접 담아서 요청
GET - 쿼리 파라미터
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달한다.
- 검색, 필터, 페이징 처리할 때 많이 사용하는 방식이다.
- ex) http://url?username=genie&age=20
클라이언트에서 서버로 데이터를 전송할 때, 쿼리 파라미터는 URL에 데이터를 넣어서 전송한다.
http://localhost:8080/request-param?username=hello&age=20&username=kim
이런식으로 ? 를 시작으로 데이터를 넣고, 파라미터들은 &로 구분한다.
서버에서 파라미터를 조회할 때 같은 이름의 파라미터들을 조회할 때는
request.getParameterValues()
예제)
url은 다음과 같이 입력할 때
http://localhost:8080/request-param?username=genie&age=20&username=happy
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
이렇게 사용하면
POST - HTML Form
- 메시지 바디에 쿼리 파라미터 형식으로 전달한다.
- ex) 회원 가입, 상품 주문, HTML Form 사용한다.
예제)
<form action="/request-param" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
<form> action을 request-param 으로 보냈다.
[ RequestParamServlet.java ]
@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("[전체 파라미터 조회] - 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");
}
}
클라이언트 입장에서는 두 방식에 차이가 있지만 ( GET, POST ) , 서버 입장에서는 둘의 형식이 동일하기 때문에,
request.getParameter() 로 편리하게 조회할 수 있다.
request.getParameter() 는 GET url 쿼리 파라미터 형식도 지원하고, POST HTML Form 형식도 지원한다.
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;
}
[ RequestBodyJsonServlet.java ]
package hello.servlet.basic.request;
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;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet 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);
}
}
postman에서 json 형식의 데이터를 보내주면
반응형
'Java > Spring' 카테고리의 다른 글
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.07.27 |
---|---|
[Spring Security] 스프링 시큐리티 초기 세팅 및 로그인 권한 설정 (0) | 2023.07.05 |
[스프링 Error] java.lang.IllegalArgumentException: Pointcut is not well-formed 에러 해결 방법 (0) | 2023.06.26 |
[Spring] Annotation 정리 (0) | 2022.11.28 |