我正在尝试使用Jetty Server创建API,并且我有一个简单的GET请求:
@GET
public String helloWorld(){
return "Hello world";
}
为了发出POST
请求,我假设必须将输入保存到Jetty服务器。我已经尝试研究了一段时间,但一无所获。
我想像这样:
@POST
public void Save(String stringToSave) {
// Save to DB?
}
答案 0 :(得分:2)
您可能会用谷歌搜索一下,但是让我给您一个快速的概述。 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
}
}
要注意的重要部分是该类扩展了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
对象定义正确,那么JAX-RS框架将自动为您将传入的JSON或XML有效负载反序列化为一个对象。
Response
对象包含HTTP响应代码(也许是一个茶壶)和一个响应正文。在此示例中,主体将以与HTTP请求的Accept
标头相匹配的方式(即,对于application/json
接受标头为JSON,对于{{1} }。
请注意,虽然不直接相关,但是JAX-RS框架利用了Servlet框架。实际上,在JAX-RS中,您可以在方法中访问application/xml
和HttpServletRequest
对象。
哪种方式“更好”?通常,我建议尽可能使用JAX-RS,因为它是较新的标准,并且易于实现。但是,如果您在JavaEE世界中从事任何工作,很可能会遇到Servlet代码,因此理解它也很重要。
请注意,Servlet和JAX-RS都需要某种类型的应用程序服务器。码头就是其中之一。另一个非常常见的是Tomcat。应用服务器为您的代码设置环境,并侦听传入的HTTP消息。当它得到一个时,它看起来是否知道如何处理该URL并路由到适当的位置。在servlet世界中,服务器仅在URL上路由。在JAX-RS世界中,服务器在URL上路由,并且在HttpServletResponse
批注中也指定HTTP @Consumes
标头。
还有更多,但让我们从那里开始,看看它是否能满足您的需求。