如何使用 Servlet API 处理 POST 请求

How to handle a POST request with a Servlet API

我正在尝试使用 Jetty 服务器创建一个 API,并且我有这个简单的 GET 请求:

@GET
public String helloWorld(){
    return "Hello world";
}

为了发出 POST 请求,我假设必须将输入保存到 Jetty 服务器。我已经尝试研究了一段时间,但一无所获。

我想象的是这样的:

@POST
public void Save(String stringToSave) {
    // Save to DB?
}

你可能会 google 这个,但让我给你一个快速的概述。 Servlet 是一段代码,在 HTTP 操作 - GET、POST 等期间通常是 运行。它是 JavaEE 世界的原始技术,具有于 1990 年代后期发布。

一个简单的 Java servlet,使用现代注释,看起来像:

@WebServlet(name = "SampleServlet", urlPatterns = "/sampleServlet")
public class SampleServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // called when an HTTP POST is sent
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // called when an HTTP GET is sent
    }
}

需要注意的重要部分是 class 扩展 HttpServlet 并且您必须编写代码以从请求中提取数据并将其推送到响应中。这不是一件坏事,但确实必须这样做。

JAX-RS 是一个较新的标准,旨在简化 REST 服务的创建。它也是在 HTTP 交互过程中 运行 的一大块代码。

一个简单的例子是:

@Path("/sampleService")
public class SampleService{
    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    @POST
    @Path("/v1/hello")

    public Response sayHello( SomeObject someobject ) {

这里的代码既简单又复杂。注释的使用有助于确定服务在 URL(在本例中为 /sampleService/v1/hello)、HTTP 方法以及请求和响应的 Content-Type 上的路径。此外,如果 SomeObject object 定义正确,JAX-RS 框架将自动将传入的 JSON 或 XML 有效负载反序列化为 object你.

Response object 包含 HTTP 响应代码(可能是一个茶壶)和一个响应 body。在此示例中,body 将以与 HTTP 请求的 Accept header 匹配的方式自动序列化回请求者(即,JSON application/jsonapplication/xml).

接受 header 和 XML

请注意,虽然没有直接关系,但 JAX-RS 框架利用了 Servlet 框架。事实上,在 JAX-RS 中,您可以在您的方法中访问 HttpServletRequestHttpServletResponse object。

"better" 是哪条路?一般来说,我建议尽可能使用 JAX-RS,因为它是较新的标准并且更容易实现。但是,如果您在 JavaEE 世界中从事任何工作,您很可能会 运行 进入 Servlet 代码,因此理解它也很重要。

请注意,Servlet 和 JAX-RS 都需要某种应用程序服务器。码头就是其中之一。另一个非常常见的是 Tomcat。应用程序服务器为您的代码设置环境并侦听传入的 HTTP 消息。当它得到一个时,它会查看它是否知道如何处理 URL 并路由到适当的位置。在 servlet 世界中,服务器仅在 URL 上路由。在 JAX-RS 世界中,服务器在 URL 上路由,如果由 @Consumes 注释指定,​​HTTP Content-Type header 也是如此。

还有很多,但让我们从这里开始,看看它是否能满足您的需求。