Post

백엔드 웹 개발 노트2.2 - HTTP Request

Http Request에 대한 내용

HTTP 요청 메시지를 통해서 클라이언트에서 서버로 전달하는 방식은 크게 3가지가 있다.

1. GET 쿼리 파라미터

  • url에 직접 요청 데이터를 때려 박는다.

  • 구문은 ‘url?username=kms&city=goyang’ 이런식으로 때려박으면된다.

  • URL에 데이터를 담아 보내고, 검색이나 필터 등에서 많이 사용하는 방식이다.

만들어보자.

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
29
30
31
32
33
34
35
36
37
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;

//url : localhost:8080//kms-request-querystring?username=kms&age=27
@WebServlet(name = "requestquerystring", urlPatterns = "/kms-request-querystring")
public class ReqeustQueryString extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("전체 파라미터 조회하는 법");
        request.getParameterNames().asIterator()
                .forEachRemaining(param -> System.out.println(request.getParameter(param)));

        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("복수 파라미터 조회하는 법");
        //url : localhost:8080/kms-request-querystring?username=kms&age=27&username=Vayne
        String[] names = request.getParameterValues("username");
        for(String name : names){
            System.out.println("usernames : " + name);
        }

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

주석으로 처리된 url을 직접 때려박으면 된다.

  • 동일 파라미터의 경우 호출하는 메소드가 다르다는 것을 인지하고 있자. 그리고 중복인 경우 getParameter()를 사용하면 getParameterValues()의 첫 번째 값을 반환한다.

2. POST HTML Form

  • 헤더값들을 뒤져보면 ‘content-type: application/x-www-form-unlencoded’라는 것이 있다. 이런것들은 Form형식으로 데이터를 보낸 것이다.
  • 메시지 바디에 쿼리 파라미터 형식으로 전달한다. 위와 같이 ‘username=kms&city=goyang’ 처럼 말이다.
  • 회원 가입, 상품 주문 등에서 사용된다.

쿼리 파라미터 형식과 보내는 데이터의 구문은 같은데 뭐가 다른걸까?

내 생각이다.
일단 메시지바디에 ‘username=kms&city=goyang’을 담으므로 url에 데이터가 나타나지 않는다.

Form형식으로 보내기 위해서 새로운 HTML파일을 만들어본다.

kms-message-body.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<form action="/kms-request-querystring" method="post">
  username: <input type="text" name="username" /> age: <input type="text" name="age" /> <button type="submit">전송</button>
</form>
</body>
</html>

‘/kms-request-quertstring’에 Post 형식으로 username과 age를 보낼 것이다.

접근한 url에 데이터를 입력하고 전송 버튼을 누르면 제대로 전달되는 것을 알 수 있다.

결과

이걸 테스트 하려고 매 번 폼을 작성하는 것은 번거롭다.

Postman을 사용해서 작성해보자.

Post 형식으로 HTMl Form은 Content-Type이 x-www-urlencoded이므로 ‘x-www-urlencoded’에 체크해주자.

그리고 key과 value값을 위처럼 설정해주면 똑같은 결과를 얻을 수 있다.

3. HTTP message Body에 데이터를 직접 담아서 요청.

  • HTTP API에서 주로 사용된다. JSON, XML, TEXT 등.

String 단순 메시지 보내기.

java 파일을 생성하자.

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
29
package hello.servlet.basic.request;

import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;

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.io.InputStream;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "httpmessagebody",urlPatterns = "/kms-request-body-string")
public class HttpMessageBody extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //messagebody를 가져옴.
        ServletInputStream inputStream = request.getInputStream();
        //알아볼 수 있는 String으로 가져와야함. UTF-8형식으로
        String text = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        //콘솔에 출력
        System.out.println("message body String : " + text);
        response.getWriter().write("ok");
    }
}

Postman으로 보내보자.

body에 체크해주고 raw로 보내고 싶은 메시지를 보내보자.

잘 간다.

JSON 형식으로 보내보기

JSON 방식으로 보내기 위해 객체를 만들 것이다. 객체 정보를 담는 클래스 파일을 만들어본다.

1
2
3
4
5
6
7
8
9
10
package hello.servlet.basic;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class JSONData {
    private String username;
    private int age;
}

그리고 새로운 서블릿을 만들어주자.

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
29
30
31
32
33
34
35
36
37
package hello.servlet.basic.request;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.JSONData;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;

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 = "httpMessageBodyJson",urlPatterns = "/kms-reqeust-json")
public class HttpMessageBodyJson extends HttpServlet {
    //Json 객체로 받기위해
    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletInputStream inputStream = request.getInputStream();
        String text = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        System.out.println("message body : " + text);

        //객체 형태로 받는 방법.
        //위에 Mapper를 선언해야함.
        //객체 형태로 메시지를 받아온다.
        JSONData jsonData = objectMapper.readValue(text, JSONData.class);
        System.out.println("jsonData.username : " + jsonData.getUsername());
        System.out.println("jsonData.age : " + jsonData.getAge());

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

Postman에서 JSON형식으로 해놓고 raw형태로 다음과 같이 보내보자.

1
{"username" : "kms", "age" : 95}

잘 간다.

  • 추가로 JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리를 추가해서 사용해야 한다. Spring Boot로 Spring MVC를 선택하면 Jackson라이브러리를 기본적으로 제공한다.
This post is licensed under CC BY 4.0 by the author.