httpservice详解

发布时间:2023-05-19

一、httpservice接口开发

httpservice是Java语言自带的HTTP服务器,提供了丰富的HTTP服务端构建方法。它可以对底层的字节流封装,对HTTP Header进行处理,提供访问参数的各种方式等。 httpservice提供了HttpService接口,我们可以通过实现这个接口来开发HTTP服务端。在接口中,我们只需要实现handle方法,并在该方法中编写处理HTTP请求的逻辑。

public interface HttpService {
    void handle(
        HttpRequest request,
        HttpResponse response,
        HttpContext context) throws HttpException, IOException;
}

其中,HttpRequest是封装了HTTP头和HTTP实体的类,HttpResponse封装了响应头和实体的类,HttpContext用来存储HTTP上下文信息。

二、httpservice是什么

httpservice是Java类库中自带的HTTP服务器,可以提供监听HTTP请求,处理HTTP请求的功能。使用httpservice搭建HTTP服务端,既可以提供Web服务,也可以提供自定义的HTTP API接口。 httpservice使用简单,轻量级,具有良好的可扩展性和性能优势,可以处理同步和异步HTTP请求。

三、httpservice启动项

在使用httpservice之前,需要新建一个HttpServer对象。HttpServer对象是httpservice中最为重要、最为基础的启动项。

HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);

其中,create方法创建了一个默认的Server对象,同时绑定了一个监听地址和端口号。第一个参数表示监听端口号,第二个参数为可选参数,表示并发请求的队列大小。 创建HttpServer对象后,需要注册HttpHandler。HttpHandler是httpservice中对请求进行处理的关键。

httpServer.createContext("/", new MyHttpHandler());

上述代码片段中,将MyHttpHandler对象注册到监听"/"路径下,随后便可以对该路径下的请求进行处理。

四、httpservice实现接口调用

当接收到某个请求时,HttpHandler将根据请求的路径查找具体的处理逻辑,并调用待实现的HttpService接口的实现类的handle方法。 下面是一个简单的HttpService实现类,处理来自客户端的请求并返回相应的Response。

public class MyHttpService implements HttpService {
    @Override
    public void handle(HttpRequest request, HttpResponse response, 
                       HttpContext context) throws HttpException, IOException {
        String method = request.getRequestLine().getMethod().toUpperCase(Locale.ENGLISH);
        if (!method.equals("GET") && !method.equals("HEAD")) {
            throw new MethodNotSupportedException(method + " method not supported");
        }
        // 检查URI是否请求了一个资源
        String target = request.getRequestLine().getUri();
        String queryString = "";
        if (target.indexOf("?") > 0) {
            queryString = target.substring(target.indexOf("?") + 1);
            target = target.substring(0, target.indexOf("?"));
        }
        // 设置响应头
        response.setStatusCode(HttpStatus.SC_OK);
        response.setEntity(new StringEntity(
            "<h1>请求的资源:" + target + "</h1><p>" + queryString + "</p>"));
    }
}