localhost:8080?username=hello&age=20
x-www-form-urlencoded
: html form으로 요청했다username=kim&age=20
)request.getParameter(..)
)따라서 request.getParameter(..)
같은 쿼리 파라미터 관련 메소드는 get방식에서도 지원되고 post html form 방식에서도 동일하게 적용 할 수 있음!
다만 get에서는 http 메시지 body를 사용하지 않기 때문에 content-type
이 없고 post html form은 content-type
이 함께 보내진다
직접 프론트에서 값을 하나하나 입력해서 하지 말고 postman을 이용하자
html form으로 테스트할때 headers의 content-type이 application/x-www-form-urlencoded
인지 확인하자!
message body는 http api에서 주로 사용하는데 대표적으로 json을 보낼때 사용함
여기서는 request 요청을 보내고 그 요청을 단순 텍스트로 받아서 출력해보겠다
ServletInputStream inputStream = request.getInputStream(); // byte로 받겠다
String messageBody = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8); // 받은 데이터를 utf-8로 변환하겠다
System.out.println("messageBody = " + messageBody);
postman으로 x-www-form-urlencoded
로 보내든지 raw
로 값을 보내든지 어떤 형식으로 값을 보내도 다 request.getInputStream()
으로 값을 받아서 utf-8로 변환해서 보여줄 수 있음.
request.getParameter(...)
는 get방식과 post일때는 x-www-form-urlencoded
일때만 받을 수 있으므로 헷갈리지 말자!
json도 단순 텍스트이기 때문에 바로 위에와 똑같이 해도 출력이 되지만 값과 키만 깔끔하게 출력하려면 ObjectMapper
클래스를 사용하면 된다.
private ObjectMapper objectMapper = new ObjectMapper(); // json 변환 라이브러리(json 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하는 라이브러리)
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class); // utf-8로 변환한 데이터가 json 형식이면 helloData 클래스 포맷으로 변환하겠다
헤더를 직접 설정해줘야 한다.
response.setStatus(HttpServletResponse.SC_OK); // 200이라고 직접 적기보다는 sc_ok같은 값을 쓰는게 좋음
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.addCookie(cookie);
response.sendRedirect("/basic/hello-form.html");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println(" <div>안녕?</div>");
writer.println("</body>");
writer.println("</html>");
여기서도 json으로 변환해야돼서 ObjectMapper
를 사용한다
HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20);
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);