如何使用 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/json
为 application/xml
).
接受 header 和 XML
请注意,虽然没有直接关系,但 JAX-RS 框架利用了 Servlet 框架。事实上,在 JAX-RS 中,您可以在您的方法中访问 HttpServletRequest
和 HttpServletResponse
object。
"better" 是哪条路?一般来说,我建议尽可能使用 JAX-RS,因为它是较新的标准并且更容易实现。但是,如果您在 JavaEE 世界中从事任何工作,您很可能会 运行 进入 Servlet 代码,因此理解它也很重要。
请注意,Servlet 和 JAX-RS 都需要某种应用程序服务器。码头就是其中之一。另一个非常常见的是 Tomcat。应用程序服务器为您的代码设置环境并侦听传入的 HTTP 消息。当它得到一个时,它会查看它是否知道如何处理 URL 并路由到适当的位置。在 servlet 世界中,服务器仅在 URL 上路由。在 JAX-RS 世界中,服务器在 URL 上路由,如果由 @Consumes
注释指定,HTTP Content-Type
header 也是如此。
还有很多,但让我们从这里开始,看看它是否能满足您的需求。
我正在尝试使用 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/json
为 application/xml
).
请注意,虽然没有直接关系,但 JAX-RS 框架利用了 Servlet 框架。事实上,在 JAX-RS 中,您可以在您的方法中访问 HttpServletRequest
和 HttpServletResponse
object。
"better" 是哪条路?一般来说,我建议尽可能使用 JAX-RS,因为它是较新的标准并且更容易实现。但是,如果您在 JavaEE 世界中从事任何工作,您很可能会 运行 进入 Servlet 代码,因此理解它也很重要。
请注意,Servlet 和 JAX-RS 都需要某种应用程序服务器。码头就是其中之一。另一个非常常见的是 Tomcat。应用程序服务器为您的代码设置环境并侦听传入的 HTTP 消息。当它得到一个时,它会查看它是否知道如何处理 URL 并路由到适当的位置。在 servlet 世界中,服务器仅在 URL 上路由。在 JAX-RS 世界中,服务器在 URL 上路由,如果由 @Consumes
注释指定,HTTP Content-Type
header 也是如此。
还有很多,但让我们从这里开始,看看它是否能满足您的需求。