HTTP Service

HttpService是基于阻塞I/O模型的服务器端HTTP协议处理程序,实现了HTTP协议服务器端报文处理的核心要求。

HttpService依赖HttpProcessor实例为将要发出的报文生成强制要求的报文头,对收到和发出的报文进行常用的修改,HTTP request handler处理应用相关的内容生成和处理。

HttpProcessor httpproc = HttpProcessorBuilder.create()
        .add(new ResponseDate())
        .add(new ResponseServer("MyServer-HTTP/1.1"))
        .add(new ResponseContent())
        .add(new ResponseConnControl())
        .build();
HttpService httpService = new HttpService(httpproc, null);

2.3.1.1 HTTP request handler

HttpRequestHandler接口表示处理一类HTTP请求的步骤。HttpService处理协议的某些方面,而单个request handler则进行应用相关的HTTP处理。使用request handler的主要目的是生成带有内容实体的应答对象,并发回给客户端。

HttpRequestHandler myRequestHandler = new HttpRequestHandler() {
    public void handle(
            HttpRequest request,
            HttpResponse response,
            HttpContext context) throws HttpException, IOException {
        response.setStatusCode(HttpStatus.SC_OK);
        response.setEntity(
                new StringEntity("some important message",
                        ContentType.TEXT_PLAIN));
    }

};

2.3.1.2 Request handler resolver

HTTP request handlers通常通过HttpRequestHandlerResolver管理,HttpRequestHandlerResolver将请求URI对应到request handler上。HttpCore包括一个request handler resolver的简单实现,HttpRequestHandlerRegistry只支持三种格式*,<uri> *,以及*<uri>

HttpProcessor httpproc = <...>
HttpRequestHandler myRequestHandler1 = <...>
HttpRequestHandler myRequestHandler2 = <...>
HttpRequestHandler myRequestHandler3 = <...>

UriHttpRequestHandlerMapper handlerMapper = new UriHttpRequestHandlerMapper();
handlerMapper.register("/service/*", myRequestHandler1);
handlerMapper.register("*.do", myRequestHandler2);
handlerMapper.register("*", myRequestHandler3);
HttpService httpService = new HttpService(httpproc, handlerMapper);

用户应该提供更复杂的HttpRequestHandlerResolver实现,例如基于正则表达式的实现。

2.3.1.3 使用HTTP Service处理请求

在完全初始化和配置之后,HttpService可以处理HTTP连接的请求。HttpService#handleRequest()方法读取收到的请求,生成应答,并发回给客户端。这个方法可以在循环中执行,来处理多个来自同一持久连接的请求。HttpService#handleRequest()可以安全地在多个线程执行。从而允许同时处理多个连接的请求,只要HttpService使用的协议拦截器和request handler是线程安全的。

HttpService httpService = <...>
HttpServerConnection conn = <...>
HttpContext context = <...>

boolean active = true;
try {
    while (active && conn.isOpen()) {
        httpService.handleRequest(conn, context);
    }
} finally {
    conn.shutdown();
}

results matching ""

    No results matching ""