티스토리 뷰
클라이언트와 서버간의 통신에서 HTTP 통신을 사용할 때 request, response를 사용한다. HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법은 3가지가 있다.
1. GET - 쿼리 파라미터
2. POST - HTML FORM
3. HTTP API message Body
GET - 쿼리 파라미터
먼저 GET 쿼리 파라미터를 이용한 방식부터 알아보자.
"/url?username=kim&age=20" 처럼 메시지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달한다.
검색, 필터, 페이징등에서 많이 사용하는 방식이다. 쿼리 파라미터는 ?를 시작으로 보낼 수 있고 추가 파라미터는 &로 구분하면 된다. 자바코드를 이용해 쿼리 파라미터를 조회하는 과정을 살펴보면
String username = request.getParameter("username"); //단일 파라미터 조회
Enumeration<String> parameterNames = request.getParameterNames(); //파라미터 이름들 모두 조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map으로 조회
String[] usernames = request.getParameterValues("username"); //복수 파라미터 조회
- getParameter 함수를 통해 원하는 쿼리 파라미터를 인자로 전달하면 값을 얻을 수 있다.
- getParameterNames 함수를 통해 URL에 포함된 모든 파라미터 이름들을 조회할 수 있다.
- getParameterMap 함수를 통해 파라미터를 Map 자료형으로 조회할 수 있다.
- getParameterValues 함수를 통해 해당 파라미터가 가진 모든 값들을 배열의 형식으로 얻을 수 있다.
POST - HTML FORM
HTML FORM을 이용한 POST 방식의 전송은 "content-type: application/x-www-form-urlencoded", 즉 메시지 바디에 쿼리 파리미터 형식으로 데이터를 전달한다. username=hello&age=20를 POST의 HTML Form을 전송하면 웹 브라우저는 다음 형식으로 HTTP 메시지를 만든다.
- 요청 URL: http://localhost:8080/request-param
- content-type: application/x-www-form-urlencoded
- message body: username=hello&age=20
application/x-www-form-urlencoded 형식은 앞서 GET에서 살펴본 쿼리 파라미터 형식과 같다. 따라서 쿼리 파라미터 조회 메서드를 그대로 사용하면 된다. 클라이언트(웹 브라우저) 입장에서는 두 방식에 차이가 있지만, 서버 입장에서는 둘의 형식이 동일하므로, request.getParameter()로 편리하게 구분없이 조회할 수 있다.
해당 동작들을 테스트 하고싶은 경우 Postman과 간단한 로컬 서버를 이용해 쉽게 테스트할 수 있다.
HTTP 요청 데이터 - API 메시지 바디
HTTP message body에 데이터를 직접 담아서 요청한다. HTTP API에서 주로 사용하고, JSON, XML, TEXT 형식을 사용한다. 데이터 형식은 주로 JSON 사용. POST, PUT, PATCH 방식의 전송에서 주로 사용한다.
가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하고 읽어보는 자바 코드를 살펴보자
@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-bodystring")
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");
}
}
HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다. InputStream은 바이트 코드를 반환하므로 우리가 읽을 수 있는 문자로 보려면 인코딩(UTF-8)을 별도로 지정해야 한다.
HTTP API에서 주로 사용하는 JSON 형식으로 데이터를 전달해보자.
- 요청 URL: http://localhost:8080/request-json
- content-type: application/json
- message body: {"username": "hello", "age": 20}
위에서 소개한 텍스트 방식과 다른 점은 content-type 부분과, message body 부분이다.
json 방식으로 전송하기 때문에 컨텐츠 타입은 application/json으로 자동으로 설정되고 message body는 {"username": "hello", "age": 20} 와 같이 json 형태의 데이터로 전달되는 점이 차이점이다.
마찬가지로 포스트맨을 이용해서 테스트해보면 쉽게 확인할 수 있다. 요즘 대부분의 서비스가 JSON 방식을 이용해 데이터를 주고받기 때문에 JSON 방식의 사용을 기본 방식이라고 생각하면 편하다.
'Network' 카테고리의 다른 글
[Network] DNS 서버에 IP 주소 조회 (0) | 2023.04.20 |
---|---|
[Network] 웹 브라우저 - HTTP 메시지 (7) | 2023.04.16 |
[HTTP] 헤더 - 캐시, 조건부 요청 (0) | 2022.01.10 |
[HTTP] HTTP BODY (0) | 2022.01.09 |
[HTTP] HTTP 상태코드 (Status) (0) | 2022.01.08 |
- Total
- Today
- Yesterday
- 스프링 Logback
- 스프링 부트
- java
- 팀프로젝트
- dm-zoned
- 피움
- 네트워크
- 런칭 페스티벌
- CI/CD
- dm-zoned 코드분석
- 회고
- jpa
- 피움 6주차 회고
- 프로젝트
- ZNS SSD
- Spring
- 5주차 회고
- 알림개선기
- 우테코 회고
- 우테코
- 백준
- 알림기능개선기
- 스프링MVC
- 파이썬
- 2차 데모데이
- 환경 별 로깅 전략 분리
- ZNS
- 3차 데모데이
- 스프링 프레임워크
- 8주차 회고
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |