Spring/SpringMVC

HTTP 요청 데이터 - POST HTML Form - 로그 에러

느리지만 꾸준하게 2022. 4. 21. 21:51

이제 HTML의 Form을 이용해 클라이언트에서 서버로 데이터를 전송해보자.

 

  • 회원가입, 상품 주문 등에서 사용하는 방식이다.

 

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다. username=hello&age=20

 

기본적으로 html 파일을 하나 만들어주자.(hello-form.html)

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

 

Form Data는 안보이네??,,,,  

결과를 확인하게 되면

// RequestParamServlet Class

System.out.println("[전체 파라미터 조회] - start");

    request.getParameterNames().asIterator()
            // paramName은 username과 age가 되고 request.getParameter라고 하면 hello, 20를 꺼내게 된다.
                    .forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));

    System.out.println("[전체 파라미터 조회] - end");



    System.out.println("[단일 파라미터 조회]");
    String username = request.getParameter("username");
    System.out.println("username = " + username);

    String age = request.getParameter("age");
    System.out.println("age = " + age);
    System.out.println();

    System.out.println("[이름이 같은 복수 파라미터 조회]");
    String[] usernames = request.getParameterValues("username");
    for (String name : usernames) {
        System.out.println("username = " + name);
    }

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

 

아래와 같이 결과를 확인할 수 있다.

username=kim&age=20]
[전체 파라미터 조회] - start
username=kim
age=20
[전체 파라미터 조회] - end
[단일 파라미터 조회]
username = kim
age = 20

[이름이 같은 복수 파라미터 조회]
username = kim

 

 

GET - 쿼리 파라미터 해서 가져온 방식과

/url?username=hello&age=20

 

POST - HTML Form 해서 가져온 방식 두개 모두

content-type: application/x-www-form-urlencoded

 

웹 브라우저가 전송해서 이렇게 데이터를 만들어준다.

Content-Type이 x -www형식으로 나오고 내용은 쿼리 파라미터 형식으로 나오게 된다.

 

 

두 개의 형식이 똑같기 때문에 request.getParameter해서 다 가져올 수 있다.

application/x-www-form-urlencoded 형식은 앞서 GET에서 살펴본 쿼리 파라미터 형식과 같고

따라서 쿼리 파라미터 조회 메서드를 그대로 사용하면 된다.

클라이언트(웹 브라우저) 입장에서는 두 방식에 차이가 있지만, 서버 입장에서는 둘의 형식이 동일하므로,

request.getParameter()로 편리하게 구분없이 조회할 수 있다. 

 

 

정리하면 request.getParameter()GET URL 쿼리 파라미터 형식도 지원하고,

POST HTML Form 형식도 둘 다 지원한다.

 

 

GET URL 쿼리 파라미터 형식과 POST HTML Form 형식 둘다 꼭 기억해두자!

 

 

HTML form을 간단한 테스트를 할때마다 만들지 말고 postman을 이용하자.

http://localhost:8080/request-param으로 지정을 해주고 Body - x-www-form-urlencoded에서 내용을 작성해주자.

로그에서 확인을 할 수 있다. 로그에서 에러가 나온다.

username=kim&age=20]
[전체 파라미터 조회] - start
2022-04-21 21:48:19.031 DEBUG 31747 --- [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header

java.io.EOFException: null
	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1339) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1226) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:805) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:360) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
	at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]

username=kim
age=20
[전체 파라미터 조회] - end
[단일 파라미터 조회]
username = kim
age = 20

[이름이 같은 복수 파라미터 조회]
username = kim
2022-04-21 21:48:19.034 DEBUG 31747 --- [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor   : Error state [CLOSE_CONNECTION_NOW] reported while processing request

 

content-type 다 맞춰서 보내는 거라서 똑같다. 즉 쿼리 파라미터 형식으로 보내면 동일하게 해결이 가능하다.

GET URL 쿼리 파라미터 형식  / POST HTML Form 형식 다 같다.(요청 파라미터)

 

 

 

 

 

 

<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com