仅使用 Java SE API 的 Java 中的简单 HTTP 服务器

2022-08-31 04:43:38

有没有办法在Java中创建一个非常基本的HTTP服务器(仅支持GET / POST),仅使用Java SE API,而无需编写代码来手动解析HTTP请求并手动格式化HTTP响应?Java SE API 很好地封装了 HTTP 客户端功能,但是是否有 HTTP 服务器功能的类似物?HttpURLConnection

需要明确的是,我在网上看到的许多例子的问题是,他们自己做请求解析/响应格式化和错误处理,这很乏味,容易出错,而且不太可能是全面的,出于这些原因,我试图避免它。ServerSocket


答案 1

从Java SE 6开始,Sun Oracle JRE中有一个内置的HTTP服务器。Java 9 模块名称是 jdk.httpservercom.sun.net.httpserver 包摘要概述了所涉及的类并包含示例。

这是从他们的文档中复制粘贴的启动示例。你可以在Java 6+上运行它。
(对于所有试图编辑它的人来说,因为它是一段丑陋的代码,请不要,这是一个复制粘贴,而不是我的,而且你永远不应该编辑引文,除非它们在原始源代码中发生了变化)

package com.stackoverflow.q3732109;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class Test {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/test", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange t) throws IOException {
            String response = "This is the response";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }

}

注意应该是他们的例子中的部分是坏的,它应该是。即使这样,该方法也必须显式指定字符集,然后在响应标头中指定该字符集。唉,尽管误导了首发球员,但这毕竟只是一个基本的开球例子。response.length()response.getBytes().lengthgetBytes()

执行它并转到 http://localhost:8000/test,您将看到以下响应:

这是回应


至于使用类,请注意,与一些开发人员的想法相反,这绝对不是众所周知的FAQ为什么开发人员不应该编写调用“sun”包的程序所禁止的。该常见问题解答涉及Oracle JRE内部使用的包(例如),因此当您在另一个JRE上运行它时会杀死您的应用程序),而不是包。Sun/Oracle也只是在Java SE API之上开发软件,就像Apache等其他公司一样。此外,每个JDK中都必须存在这种特性,因此绝对不会像软件包那样出现“可移植性”问题。仅当涉及某个Java API的实现时,才不鼓励使用类(但不禁止),例如GlassFish(Java EE impl),Mojarra(JSF impl),Jersey(JAX-RS impl)等。com.sun.*sun.*sun.misc.BASE64Encodercom.sun.*HttpServersun.*com.sun.*


答案 2

查看 NanoHttpd

NanoHTTPD是一个轻量级的HTTP服务器,设计用于嵌入其他应用程序,在修改后的BSD许可证下发布。

它是在Github开发的,并使用Apache Maven进行构建和单元测试。


推荐