본문 바로가기
Java

[Java] HTTP 웹 서버 구현 / POST 방식으로 회원가입

by bkuk 2023. 3. 17.

POST 방식에서의 HTTP Header와 Body

POST /user/create HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Accept: */*
(공백)
userId=tester1&password=test1&name=테스터

 

  • POST로 데이터를 전달할 경우 전달하는 데이터는 HTTP 본문에 담긴다.
    • HTTP 본문은 HTTP 헤더 이후 빈 공백을 가지는 한 줄(line) 다음부터 시작한다.
    • HTTP 본문에 전달되는 데이터는 GET 방식으로 데이터를 전달할 때의 키=value 형식과 같다.
    • 요청 헤더에 본문 데이터에 대한 길이가 Content-Length라는 필드 이름으로 전달된다.

 

전체 코드

public void run() {
    log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(),
            connection.getPort());

    try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) {
        BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
        String line = br.readLine();
        log.debug("Request Line : {}", line);
        String[] tokens = line.split(" ");
        int contentLength = 0;
        while( (line = br.readLine()) != null ) {
            log.debug("Request Header : {}", line);
            if( line.contains("Content-Length")) {
                contentLength = Integer.parseInt( line.split(": ")[1] );
            }
            if( line.equals("")) {
                break;
            }
        }
        String requestURI = tokens[1]; 
        if( requestURI.contains("/user/create")) {
            String requestBody = IOUtils.readData(br, contentLength);
            Map<String, String> parameterMap = HttpRequestUtils.parseQueryString(requestBody);
            User user = new User(
                    parameterMap.get("userId"),
                    parameterMap.get("password"),
                    parameterMap.get("name"),
                    parameterMap.get("email") );
            log.debug("User Model : {}", user.toString());
            requestURI = "/index.html";
            DataOutputStream dos = new DataOutputStream(out);
            byte[] body = Files.readAllBytes(Paths.get("./webapp" + requestURI));
            response302Header(dos, requestURI);
            responseBody(dos, body);
        } else {
            DataOutputStream dos = new DataOutputStream(out);
            byte[] body = Files.readAllBytes(Paths.get("./webapp" + requestURI));
            response200Header(dos, body.length);
            responseBody(dos, body);
        }
    } catch (IOException e) {
        log.error(e.getMessage());
    }
}

댓글