不直接编写 Servlet 来创建 REST API 的原因
在我目前的公司,我们正在启动一个新项目,该项目将是Java中的REST API,部署在像Tomcat这样的servlet容器中。在我之前使用REST框架的经验中,例如JAX-RS与Jersey,JBOSS REST Easy,Spring MVC,我知道使用这样的框架比直接编写Servlet来处理请求有什么优势。
(当然,我们知道上述框架仍然在幕后使用Servlets)
我发现很难说服他们。由于他们建议编写servlet,认为它对性能更好(这可能是这种情况,但我认为使用其中一个框架的开销对于REST API来说应该是微不足道的)。
以下是我的理由:
1)更少的样板和更简洁的代码(更易于维护和测试)。使用 JAX-RS 框架或 SpringMVC,您可以非常轻松地定义 REST 资源,方法是编写带有注释的方法,这些注释指示资源的 PATH、要使用的 http 方法、查询和 url 参数、接受的编码等标头等。
例:
@GET
@Path("/users")
@Produces({MediaType.APPLICATION_JSON})
public UserList getUsers(@QueryParam("group") String group) {
return userService.findUsers(group);
}
使用servlets,你至少需要这样的东西:
映射 Web.xml中的每个 servlet 的 url(这在 Servlet 3.0 及更高版本中不是必需的):
<servlet>
<servlet-name>UsersServlet</servlet-name>
<servlet-class>test.UsersServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UsersServlet</servlet-name>
<url-pattern>/users</url-pattern>
</servlet-mapping>
然后在 servlet 类中:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String group = request.getParameter("group");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
JsonSerializer someJsonSerializer = new JsonSerializer();
String json = someJsonSerializer.serialize(userService.findUsers(group));
out.print(json);
}
2)适应性强。上述框架允许您轻松地向应用程序添加功能,否则您将需要手动执行此操作,例如使用多个媒体类型的输入和输出。例如,根据接受标头使服务返回 xml 或 json 或任何其他服务。像SpringMVC和Jersey这样的框架使得为您的请求和响应配置序列化程序/反序列化程序变得非常容易。
3) REST 最佳实践。通常,这些框架是在对REST API要遵循的最佳实践的深刻理解的基础上构建的,并且基于REST架构的标准进行定义,这使得构建可靠且符合标准的应用程序变得更加容易。另一方面,Servlets在如何处理您的请求/响应方面为您提供了如此高的自由度,以至于很难意识到您根本不是RESTfull。
还有其他的吗?