Java HttpServer
contents
Java HttpServer란?
Java 에서 제공하는 내부적으로 NIO를 사용하는 고수준 HTTP 서버 API.
Java HttpServer Example
1. 서버 객체 준비 & Listen
/*
* This Java source file was generated by the Gradle 'init' task.
*/
package com.gyo.java.httpserver;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
public class App {
public static void main(String[] args) throws IOException {
App app = new App();
app.run();
}
private void run() throws IOException {
// Listener 구현
InetSocketAddress address = new InetSocketAddress(8080);
HttpServer httpServer = HttpServer.create(address, 0); // backlog는 기본값으로 설정
// Listen
httpServer.start();
}
}
어플리케이션을 실행하면 서버가 listen한다. 그리고 curl로 요청을 보내보자.
HttpServer 객체에서 기본적으로 404 Not Found 응답을 해주는 것을 알 수 있다.
2. URL(정확히는 path)에 핸들러 지정
서버(리스너)를 start하기 전에 핸들러를 지정해야 한다.
HttpContext
HttpContext는 어떤 어플리케이션의 루트 URI 경로와 그 경로로 들어오는 요청을 처리하는 HttpHandler 사이의 mapping이다. 즉, 특정 URI 경로로 들어오는 요청이 처리될 때 호출되는 HttpHandler를 관리하는 역할을 한다.
handler 와 람다 표현식
핸들러는 HTTP Exchange를 처리하기 위해 호출(invoked)된다.
이 인터페이스는 추상 메서드가 하나 뿐이다. 즉 함수형 인터페이스이다. 따라서 람다 표현식을 사용할 수 있다. 이런 인터페이스는 명시적으로 @FunctionalInterface 어노테이션이 붙어 있지 않더라도, 컴파일러가 함수형 인터페이스로 판단하게 된다.
3. Request
Http Exchange에 Request에 관한 데이터가 포함되어 있다.
HTTP Method
HTTP path
Headers
Body
HTTPie를 통해 body 넣어서 요청보내기
어플리케이션 코드는 아래와 같다.
curl로 기본적인 GET요청을 보내면 Body가 없다.
HTTPie를 통해서 Request Body를 추가해보자.
참고
이렇게 코드를 작성하면, byte 배열에서 각 요소에 toString()을 호출해서 []안에 담게된다. 이렇게 하면 문제점은 byte타입의 toString()은 아스키코드 값을 호출하게 되서 [72, 101, 108, 108, 111] 이런 값이 출력된다.
4. Response
HTTP Status Code와 Content-Length 지정해야한다. Content-Lenght 때문에 바이트 배열을 통해서 length값을 얻어야 하는 것에 주의하자.
이제 curl로 요청을 보내면 body를 확인할 수 있다.
하위 path에 대한 헨들러를 추가해보자.
Last updated