본문 바로가기
Java

[JAVA] HTTP서버에 GET, POST 요청하기

by teamnova 2023. 11. 4.
728x90

저번 게시글 (https://stickode.tistory.com/957 ) 에 이어서 오늘은 클라이언트를 만들고, GET과 POST를 진행해보겠습니다.

 

 

// HTTP 서버 구현 클래스
public class SimpleHttpServer {

    // 로거 인스턴스 생성
    private static final Logger logger = Logger.getLogger(SimpleHttpServer.class.getName());

    // 메인 실행 메서드
    public static void main(String[] args) throws Exception {
        // 포트 8000에서 동작하는 HTTP 서버 인스턴스 생성
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);

        // '/test' 경로에 대한 핸들러 설정
        server.createContext("/test", new TestHandler());

        // 루트 경로에 대한 에러 핸들러 설정
        server.createContext("/", new ErrorHandler());

        // 스레드 풀 설정 (null로 설정 시 기본 executor 사용)
        server.setExecutor(null);

        logger.info("Server started at port 8000.");

        // 서버 시작
        server.start();
    }

    // '/test' 경로의 요청 핸들러
    static class TestHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            logger.info("Received request: " + exchange.getRequestMethod() + " " + exchange.getRequestURI());

            if ("GET".equals(exchange.getRequestMethod())) {
                handleGetRequest(exchange);
            } else if ("POST".equals(exchange.getRequestMethod())) {
                handlePostRequest(exchange);
            } else {
                logger.warning("Unsupported request method: " + exchange.getRequestMethod());
                exchange.sendResponseHeaders(405, -1); // 405 Method Not Allowed
            }
        }

        private void handleGetRequest(HttpExchange exchange) throws IOException {
            String response = "Hello, HTTP!";
            exchange.sendResponseHeaders(200, response.length());
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }

        private void handlePostRequest(HttpExchange exchange) throws IOException {
            // POST 데이터 읽기
            InputStreamReader isr = new InputStreamReader(exchange.getRequestBody(), StandardCharsets.UTF_8);
            BufferedReader br = new BufferedReader(isr);
            String query = br.readLine();

            logger.info("Received POST data: " + query);

            exchange.sendResponseHeaders(200, query.length());
            OutputStream os = exchange.getResponseBody();
            os.write(query.getBytes());
            os.close();
        }
    }

    // 루트 경로 외의 요청 핸들러 (에러 처리)
    static class ErrorHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            logger.warning("Invalid request path: " + exchange.getRequestURI());

            String errorResponse = "404 Error: Invalid path!";
            exchange.sendResponseHeaders(404, errorResponse.length());
            OutputStream os = exchange.getResponseBody();
            os.write(errorResponse.getBytes());
            os.close();
        }
    }
}
// HTTP 클라이언트 구현 클래스
public class SimpleHttpClient {

    // 메인 실행 메서드
    public static void main(String[] args) throws Exception {
        // HTTP 클라이언트 인스턴스 생성
        HttpClient client = HttpClient.newHttpClient();

        System.out.println("Sending GET request...");
        sendGetRequest(client);

        System.out.println("Sending POST request...");
        sendPostRequest(client);
    }

    private static void sendGetRequest(HttpClient client) throws Exception {
        // 'http://localhost:8000/test' URI로 HTTP GET 요청 객체 생성
        HttpRequest getRequest = HttpRequest.newBuilder()
                .uri(new URI("http://localhost:8000/test"))
                .GET() // GET method is default
                .build();

        // GET 요청 전송 및 응답 수신
        HttpResponse<String> getResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString());

        // GET 응답 본문 출력
        System.out.println("GET Response: " + getResponse.body());
    }

    private static void sendPostRequest(HttpClient client) throws Exception {
        String postData = "This is a POST request body";

        // 'http://localhost:8000/test' URI로 HTTP POST 요청 객체 생성
        HttpRequest postRequest = HttpRequest.newBuilder()
                .uri(new URI("http://localhost:8000/test"))
                .POST(HttpRequest.BodyPublishers.ofString(postData))
                .build();

        // POST 요청 전송 및 응답 수신
        HttpResponse<String> postResponse = client.send(postRequest, HttpResponse.BodyHandlers.ofString());

        // POST 응답 본문 출력
        System.out.println("POST Response: " + postResponse.body());
    }
}

 

 

 

 

서버를 먼저 실행하시고, 그 다음 클라이언트를 실행하시면 됩니다.