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());
}
}
서버를 먼저 실행하시고, 그 다음 클라이언트를 실행하시면 됩니다.
'Java' 카테고리의 다른 글
[JAVA] Swing 라이브러리를 사용하여 디지털 시계를 만들기 (0) | 2023.11.14 |
---|---|
[JAVA] HTTP로 이미지 업로드 및 다운로드 하기 (2) | 2023.11.13 |
[JAVA] 간단한 HTTP서버 만들기 (0) | 2023.10.25 |
[Java] 데이터를 Thread에서 공통으로 사용하는 방법 예제 (0) | 2023.10.17 |
[JAVA] 소켓을 활용한 간단한 에코 서버와 클라이언트 (0) | 2023.10.14 |