오늘 할 일
HTTP 요청 데이터-API 메시지 바디를 활용하여 직접 바디 태그를 채워서
서버에게 데이터 요청하기
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
- 먼저 가장 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하고, 읽어보자.
- HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
packagehello.servlet.basic.request;
import org.springframework.util.StreamUtils;
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="requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
//message body의 내용을 바이트 코드로 얻는다.
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
//위에서 얻은 바이트 코드를 String으로 바꾸기 위해 스프링이 제공하는 Utility를 사용한다.
//추가로 꺼낼때는 인코딩 정보를 알려줘야 한다.
System.out.println("messageBody = " + messageBody);
response.getWriter().write("ok");
}
}
위 코드 작성에서 option+command+V로 자동완성을 활용한다.
위 코드를 테스트 하기 위해서는 postman을 사용한다.
- 문자전송content-type:text/plain결과 : messageBody = hello!
- message body: hello!
- POST http://localhost:8080/request-body-string
*참고
inputStream은 byte코드를 반환한다. byte 코드를 우리가 읽을 수 있는 문자(String)로 보려면 문자표(Charset)를 지정해주어야 한다. 여기서는 UTF-8 Charset을 지정해주었다.
이번에는 HTTP API에서 주로 사용하는 JSON 형식으로 데이터를 전달해보자
JSON 형식 전송
- POST http://localhost:8080/request-body-json
- content-type : application/json
- message body : {”username”: “hello”, “age”: 20}
- 결과: messageBody = {”username”: “hello”, “age”: 20}
JSON 형식 파싱 추가
JSON 형식으로 파싱할 수 있게 객체를 하나 생성
hello.servlet.basic.HelloData
packagehello.servlet.basic;
importlombok.Getter;
importlombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
}//lombok라이브러리를 통해서 getter와setter를 따로 만들지 않고 어노테이션으로 처리한다.
API messageBody에서 텍스트를 가져온 것과 마찬가지로 inputStream을 받아온다.
packagehello.servlet.basic.request;
import org.springframework.util.StreamUtils;
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="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);
response.getWriter().write("ok");
}
}
그 다음으로 HelloData를 변화시키려면 Json라이브러리가 필요하다.
Json라이브러리는 기본으로 jackson라이브러리를 사용한다.
@WebServlet(name="requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
**private ObjectMapper objectMapper =new ObjectMapper();//jackson라이브러리 사용**
@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.getUsername() = " + helloData.getUsername());
System.out.println("helloData.getAge() = " + helloData.getAge());
response.getWriter().write("ok");
}
}
👉🏻참고
JSON결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson같은 JSON변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트로 SpringMVC를 선택하면 기본으로 Jackson 라이브러리(ObjectMapper)를 함께 제공한다.
참고
HTML form 데이터도 메시지 바디를 통해 전송되므로 직접 읽을 수 있다. 하지만 편리한 파라미터 조회 기능 (request.getParameter(…))을 이미 제공하기 때문에 파라미터 조회 기능을 사용하면 된다.
위와 같이 HTML form으로 데이터를 보내더라도 아래와 같이 HTTP meassageBody의 내용을 가져 올 수는 있다.(아래의 에러는 json형식이 아니어서 파싱과정에서 발생한 에러이다.
JSON 형식 전송
- POST http://localhost:8080/request-body-json
- content-type : application/json
- message body : {”username”: “hello”, “age”: 20}
- 결과: messageBody = {”username”: “hello”, “age”: 20}
JSON 형식 파싱 추가
JSON 형식으로 파싱할 수 있게 객체를 하나 생성
hello.servlet.basic.HelloData
packagehello.servlet.basic;
importlombok.Getter;
importlombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
}//lombok라이브러리를 통해서 getter와setter를 따로 만들지 않고 어노테이션으로 처리한다.
API messageBody에서 텍스트를 가져온 것과 마찬가지로 inputStream을 받아온다.
packagehello.servlet.basic.request;
import org.springframework.util.StreamUtils;
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="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);
response.getWriter().write("ok");
}
}
그 다음으로 HelloData를 변화시키려면 Json라이브러리가 필요하다.
Json라이브러리는 기본으로 jackson라이브러리를 사용한다.
@WebServlet(name="requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
**private ObjectMapper objectMapper =new ObjectMapper();//jackson라이브러리 사용**
@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.getUsername() = " + helloData.getUsername());
System.out.println("helloData.getAge() = " + helloData.getAge());
response.getWriter().write("ok");
}
}
👉🏻참고
JSON결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson같은 JSON변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트로 SpringMVC를 선택하면 기본으로 Jackson 라이브러리(ObjectMapper)를 함께 제공한다.
참고
HTML form 데이터도 메시지 바디를 통해 전송되므로 직접 읽을 수 있다. 하지만 편리한 파라미터 조회 기능 (request.getParameter(…))을 이미 제공하기 때문에 파라미터 조회 기능을 사용하면 된다.
HTML form으로 데이터를 보내더라도 아래와 같이 HTTP meassageBody의 내용을 가져 올 수는 있다.(아래의 에러는 json형식이 아니어서 파싱과정에서 발생한 에러이다.
'모각코' 카테고리의 다른 글
절개와지조 1차 모각코 (0) | 2023.07.06 |
---|---|
눈이 녹으면 Spring-MVC 1월 31일 8회차 (0) | 2023.01.31 |
눈이 녹으면 Spring-MVC 1월 24일 6회차 (1) | 2023.01.24 |
눈이 녹으면 Spring-MVC 1월 23일 5회차 (0) | 2023.01.23 |
눈이 녹으면 Spring-MVC 1월 10일 4회차 모각코 (1) | 2023.01.10 |