vibe.d 를 이용해 HTTP(S) 프로토콜을 처리하는 웹 서버를 즉석으로 만들 수 있습니다.
auto settings = new HTTPServerSettings;
settings.port = 8080;
listenHTTP(settings, &foo);
이 예제 코드는 8080포트에서 들어온 접속을 foo
라는 함수에게 전달해 HTTP 요청을 처리하도록 합니다.
listenHTTP에 전달될 함수는 HTTPServerRequest
와 HTTPServerResponse
객체를 입력으로 받습니다. 여기에서는 foo
를 예로 들겠습니다.
void foo(HTTPServerRequest req,
HTTPServerResponse res) { ... }
물론 foo
와 같은 델리게이트에서 조건문을 사용해 HTTP 메소드와 경로별로 일일이 처리할 수도 있지만, 번거롭습니다.
이에 따라 HTTP 요청의 메소드(method)가 GET
인지 POST
인지 혹은 다른 것인지, 어떤 경로로 요청이 온건지에 따라 .get("path", handler)
나 .post("path", handler)
등 사전에 정의된 적절한 내부함수를 호출해주는 URLRouter
클래스가 편의를 위해 제공됩니다. 추가로 웹서버 상의 경로를 내부 함수로 연결해주는 웹 인터페이스 또한 등록이 가능합니다.
auto router = new URLRouter;
router.registerWebInterface(new WebService);
listenHTTP(settings, router);
WebService
는 아래의 간단한 규칙에 따라 웹 서비스로 들어온 요청을 내부 함수로 연결해줍니다.
index()
함수명은 /index
경로를 요청할 때 호출됩니다.
getName()
함수명은 GET (get)
메소드로 /name (Name)
을 요청할 때 호출될 함수명의 형태입니다.
postUsername()
함수명은 POST (post)
메소드로 /username (Username)
을 요청할 때 호출될 함수명의 형태입니다.
이러한 규칙에 따르기 힘든 경로라면, 내부 함수를 선언할 때 @path("/hello/world")
형태로 속성을 정의해주면 됩니다.
특히, 내부함수 선언시 입력값의 이름 앞에 _
를 붙이게 되면 POST
메소드로 요청을 처리할 수 있는 내부 함수가 됩니다.
그리고 내부 함수의 입력값으로 받아올 웹 요청 파라미터는 직접 @path
속성 내에 아래와 같이 지정할 수 있습니다.
:id
로 HTTP 요청에서 받아온 값은 int _id
내에 저장됩니다.
@path("/my/api/:id")
void foo(int _id)
HTTP 요청을 처리할 함수에 모두 HTTPServerRequest
와 HTTPServerResponse
를 받도록 반드시 정의할 필요는 없습니다. 둘 중 하나만 적어도 되고, 아예 생략해도 됩니다.
vibe.d 프레임워크가 미리 검사하여, 파라미터로 전달할 필요가 없는 경우에는 그냥 넘어갑니다.