В моей нынешней компании мы начинаем новый проект, который будет REST API в Java, развернутый в контейнере сервлетов, таком как Tomcat. В моем предыдущем опыте использования REST-фреймворков, таких как JAX-RS с Джерси, JBOSS REST Easy, Spring MVC. Я знаю, каковы некоторые преимущества использования фреймворка, например, над написанием непосредственно сервлетов для обработки запросов.
(Конечно, мы знаем, что упомянутые фреймворки по-прежнему используют сервлеты под обложками)
Мне трудно их убедить. Поскольку они предлагают писать сервлеты, думая, что это лучше для производительности (что может быть так, но я думаю, что накладные расходы на использование одной из этих фреймворков должны быть несущественными для 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);
}
С сервлетами вам понадобится хотя бы что-то вроде этого:
Сопоставьте URL-адрес для каждого сервлета в web.xml(который не нужен в 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>
Затем внутри класса сервлета:
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 или любого другого в зависимости от заголовка accept. Рамки, такие как SpringMVC и Jersey, очень упрощают настройку сериализаторов/десериализаторов для ваших запросов, ответов.
3) Лучшие методы REST. Обычно эти структуры основаны на надежном понимании лучших практик, которым должен следовать API REST, и определяются на основе стандартов архитектуры REST, что упрощает создание надежного и стандартного соответствующего приложения. С другой стороны, сервлеты дают вам такой высокий уровень свободы в том, как обрабатывать ваши запросы/ответы, что будет сложнее понять, что вы вообще не являетесь RESTfull.
Любые другие?