API Message Body 데이터 요청
HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용. JSON, XML, TEXT
- 데이터 형식은 주로 JSON사용
- POST, PUT, PETCH
가장 단순한 테스트 메세지를 HTTP 메세지 바디에 담아서 전송
HTTP 메세지 바디에 이터를 inputstream을 사용해서 직접 읽을 수 있다.
@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 = "+messageBody );
resp.getWriter().write("ok");
}
우리가 postman을 통해 post method방식으로 전송한 값을 위처럼 inputstream을 통해 값을 읽어오는게 가능하다.
전송 값 : username = kim , age = 28
[결과]
하지만 요즘은 이런식으로 문자를 주고 받는게 아니라 JSON형식으로 주고 받기 때문에 JSON방식으로 시도해보자.
JSON 형식 전송
- method : post
- content-Type : application/json
- message body : {"username":"hello","age":20}
- 결과 : messageBody = {"username":"hello","age":20}
JSON형식으로 만들기 위해서 객체를 만들어야 한다. 흔히 말하는 VO이다.
private String username;;
private int age;
간단하게 username과 age를 받는 객체를 만들었다.
위의 코드에는 넣지 않았지만 이 객체는 private이기 때문에 꺼내오고 불러오기 위해서는 getter와 setter라는 것이 필요하다. 메소드를 만들수도 있지만 우리가 초기에 설정한 lombok이 있기 때문에 클래스 위에 @Getter @Setter를 입력해 주면 알아서 getter와 setter를 만들어 준다.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = "+messageBody );
여기까지는 앞서 일반 문자로 받을때와 같은 모습이다. json형식으로 받아오는 방법에는 jackson이라는 라이브러리를 이요하면 되는데 우리가 사용중인 spring boot에서는 이미 포함이 되어 있기 때문에 jackson을 불러온 뒤 값을 꺼내오면 된다.
@WebServlet(name = "requestBodyJsonServlet",urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@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 );
HelloData hellodata = objectMapper.readValue(messageBody,HelloData.class);
System.out.println("helloData.username = "+hellodata.getUsername());
System.out.println("helloData.age = "+hellodata.getAge());
}
}
입력 값 : {"username":"kim","age":49}
위의 코드를 분석하면 먼저 Objectmapper를 객체로 만든 뒤 readValue를 통해 postman에서 요청이 온 데이터를 inputstream으로 받은뒤 방금 만든 VO객체와 이름이 일치하는 객체에 담기게 된다. 그리고 system.out.println을 통해 하나씩 불러온 모습을 볼 수 있다.
[결과]
messageBody = {"username":"kim","age":49}
helloData.username = kim
helloData.age = 49
JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변화하려면 Jackson,Gson 같은 JSON 변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트로 선택하면 기본으로 Jackson라이브러리(ObjectMapper)를 함께 제공한다.
HTML form 데이터도 메세지 바디를 통해 전송되므로 직접 읽을 수 있다. 하지만 편리한 파라미터 조회 기능(request.getParameter)을 이미 제공하기 때문에 파림터 조회 기능을 사용하면 된다.