728x90
반응형
HTTP 요청데이터
어떻게 클라이언트에서 서버로 HTTP 요청 메시지를 통해 데이터를 전달 할까?
주로 3가지 방법이 있다.
Get 방식 쿼리 파라미터.
- 보통 우리가 네이버를 검색할때 나가는 url 을 생각 하면될것 같다.
- naver 에서 강아지라고 검색하면 url이 다음과같이 변경된다.
? 부터가 쿼리의 시작이다.
https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EA%B0%95%EC%95%84%EC%A7%80
- 바디없이 쿼리파라미터에 데이터를 담아 전달한다.
- 예) 조회, 필터 등
Post - HTML Form
- 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&hobby=drum
- content type:
- content-type:application/x-www-form-urlencoded - 예) 회원 가입, 상품 주문, HTML Form 사용시
HTTP message body에 데이터를 직접 담아서 요청한다.
- HTTP API에서 주로 사용 JSON, XML, TEXT
- 데이터 형식은 주로 JSON사용
- POST, PUT, PATCH
POST 예제- HTML 예제
Get 방식 쿼리 파라미터 예제
- 메시지 바디 없이, URL의 쿼리 파라미터를 사용해서 데이터를 전달한다.
- Get 파라미터는 다음과 같이 조회 할 수 있다.
- getParameternames() 함수를 사용
request.getParameterNames() .asIterator() .forEachRemaining(paraName-> System.out.println(paraName +"="+ request.getParameter(paraName)));
- 단일 파라미터 조회
String username = request.getParameter("username"); //단일 파라미터 조회
- 파라미터 Map 으로조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map
- 복수로 들어오는 경우가 있을때는 어떻게 해결을 해야될까?
- 아래와 같이 username이 2번 입력 되었을때
- http://localhost:8080/request-param?username=skahn&hobby=drum&username=skahn2
- 복수로 들어오는 경우에는 getParameterValues 함수를 사용해야 된다.String []usernames = request.getParameterValues("username"); for (String name : usernames) { System.out.println("username" + name); }
- gerParameter() 를 사용하게 되면 첫번째 값을 반환한다.
Post - HTML Form 예제
HTML form 을 사용하여 데이터를 전송한다.
특징
- content-type: application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다.
- username=hello&hobby=drum - html 생성후 전송 버튼을 누르면 아래 서블릿으로 넘어간다.
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>
서블릿
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;
/**
* 1. 파라미터 전송기능
* http://localhost:8080/request-param?username=skahn&hobby=drum
*/
@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("Search all parameter - start");
request.getParameterNames()
.asIterator()
.forEachRemaining(paraName-> System.out.println(paraName +"="+ request.getParameter(paraName)));
System.out.println("Search all parameter - end");
System.out.println();
System.out.println("Search single parameter - start");
String username = request.getParameter("username");
String hobby = request.getParameter("hobby");
System.out.println("username: "+username);
System.out.println("hobby: "+hobby);
System.out.println("조회 single parameter - end");
System.out.println("복수 조회 - start");
String []usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("user name " + name);
}
response.getWriter().write("OK");
}
}
HTTP 요청데이터 - API 메시지 바디
단순텍스트
- Http message body에 데이터를 직접 담아서 요청
- HTTP API 에서 사용한다 현재는JSON 으로 거의다 보낸다.
- POST, PUT, PATCH
- body에 text로 요청이 왔을경우
- request 에서 inputstream을 가져온뒤
- StreamUtils.copyToString(inputstream, encoding) 함수로 text 를 가져올수 있다.
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();// body의 내용을 바로 byte code 로 가져온다.
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // 인코딩을 지정해줘야한다.
System.out.println("messageBody = " + messageBody);
resp.getWriter().write("OK");
}
JSON 형식
- JSON 형태로 데이터를 전송
- content-type:
- content-type: application/json - 다음과 같이 json 을 만든다.
- {"username": "hello", "hobby": "drum"} - json 형식을 클래스로 담아본다.
HelloData class
import lombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
- 요청된 JSON 형태의 데이터를 클래스로 변환하기 위해서는
- ObjectorMapper 가 필요하다.
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println(messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData = " + helloData.getUsername());
System.out.println("helloData = " + helloData.getHobby());
resp.getWriter().write("OK");
}
}
참고
- JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리를
추가 해야 되지만 스프링에는 기본적으로 제공해준다.
728x90
반응형
'Spring > spring framework 구현 스터디' 카테고리의 다른 글
[Spring] 서블릿, JSP 예제 (0) | 2021.10.11 |
---|---|
[Spring] Servlet 다루기 3: HttpServletResponse 예제 (0) | 2021.10.11 |
[Spring] Servlet 다루기 1: Servlet, HttpServletRequest (0) | 2021.10.09 |
[Spring] 멀티 쓰레드 (0) | 2021.10.05 |
[Spring] Servlet (0) | 2021.10.04 |
댓글