Автор оригинала: Pankaj Kumar.
Добро пожаловать в учебник по отдыху. RESTEasy – это реализация JAX-RS, предоставляемая проектом JBoss. Мы можем использовать REST Easy для создания веб-сервисов restful. RESTEasy обеспечивает более тесную интеграцию с сервером приложений JBoss, но мы можем развернуть его в любом контейнере сервлетов. Итак, сегодня мы узнаем, как создать restful веб-сервис с помощью RestEasy framework и развернуть его в контейнере сервлетов Tomcat для его тестирования.
Легкий учебник
Некоторые из особенностей RESTEasy framework заключаются в следующем:
- Совместимость с API JAX-RS – поэтому в основном вам нужно подключить его к кодированию API JAX-RS для создания веб-служб rest.
- Работает практически на любом контейнере сервлетов, поддерживающем Java 6 или выше
- Обеспечивает поддержку написания клиентских программ с использованием клиентского API JAX-RS 2.0. Мы также рассмотрим программу тестирования.
- Богатый набор поставщиков – XML, JSON, YAML, Multipart, XOP, Atom и т.д.
- OAuth2 и Распределенный единый вход с JBoss AS7
- Интеграция EJB, Seam, Guice, Spring и Spring MVC
Простой Пример
Ниже приведены URI, которые мы будем раскрывать в нашей реализации веб-службы RestEasy.
/сотрудник/добавить | Добавьте сотрудника | ПОСТ |
/сотрудник/getDummy | возвращает фиктивный объект сотрудника | ПОЛУЧИТЬ |
/сотрудник/{идентификатор}/получить | Получите сотрудника с “идентификатором” в URL-адресе | ПОЛУЧИТЬ |
/сотрудник/GetAll | Соберите всех сотрудников | ПОЛУЧИТЬ |
/сотрудник/{идентификатор}/удалить | Удалите сотрудника с “идентификатором” в URL-адресе | УДАЛИТЬ |
Простой пример проекта Eclipse
На рисунке ниже показана наша окончательная структура проекта. Прежде всего, создайте “Динамическое веб-приложение” в Eclipse, а затем преобразуйте его в проект Maven, чтобы получить скелет веб-проекта.
Давайте рассмотрим различные компоненты нашего проекта веб-сервисов RestEasy.
Повторите Примеры Классов Моделей
У нас есть два класса моделей – Сотрудник
для объекта сотрудник и GenericResponse
для отправки объекта ответа клиента для статуса, сообщения и кода ошибки.
package com.journaldev.jaxrs.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "employee") public class Employee { private String name; private double salary; private int id; public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public String toString() { return id + "::" + name + "::" + salary; } }
package com.journaldev.jaxrs.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "response") public class GenericResponse { private boolean status; private String message; private String errorCode; public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getErrorCode() { return errorCode; } public void setErrorCode(String errorCode) { this.errorCode = errorCode; } @Override public String toString() { return status + "|" + message + "|" + errorCode; } }
Обратите внимание, что оба компонента java аннотированы аннотацией @XmlRootElement
. Это требуется для API JAXB для преобразования объектов в xml и наоборот.
Примеры классов обслуживания RESTEasy
Давайте сначала создадим интерфейс для всех операций, которые мы пытаемся представить в нашем веб-сервисе restful.
package com.journaldev.jaxrs.service; import javax.ws.rs.core.Response; import com.journaldev.jaxrs.model.Employee; public interface EmployeeService { public Response addEmployee(Employee e); public Response deleteEmployee(int id); public Employee getEmployee(int id); public Employee[] getAllEmployees(); }
Ниже приведен класс реализации для вышеуказанного интерфейса обслуживания сотрудников.
package com.journaldev.jaxrs.service; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import com.journaldev.jaxrs.model.Employee; import com.journaldev.jaxrs.model.GenericResponse; @Path("/employee") @Consumes(MediaType.APPLICATION_XML) @Produces(MediaType.APPLICATION_XML) public class EmployeeServiceImpl implements EmployeeService { private static Mapemps = new HashMap (); @Override @POST @Path("/add") public Response addEmployee(Employee e) { GenericResponse response = new GenericResponse(); if(emps.get(e.getId()) != null){ response.setStatus(false); response.setMessage("Employee Already Exists"); response.setErrorCode("EC-01"); return Response.status(422).entity(response).build(); } emps.put(e.getId(), e); response.setStatus(true); response.setMessage("Employee created successfully"); return Response.ok(response).build(); } @Override @DELETE @Path("/{id}/delete") public Response deleteEmployee(@PathParam("id") int id) { GenericResponse response = new GenericResponse(); if(emps.get(id) == null){ response.setStatus(false); response.setMessage("Employee Doesn't Exists"); response.setErrorCode("EC-02"); return Response.status(404).entity(response).build(); } emps.remove(id); response.setStatus(true); response.setMessage("Employee deleted successfully"); return Response.ok(response).build(); } @Override @GET @Path("/{id}/get") public Employee getEmployee(@PathParam("id") int id) { return emps.get(id); } @GET @Path("/{id}/getDummy") public Employee getDummyEmployee(@PathParam("id") int id) { Employee e = new Employee(); e.setSalary(8976.55); e.setName("Dummy"); e.setId(id); return e; } @Override @GET @Path("/getAll") public Employee[] getAllEmployees() { Set ids = emps.keySet(); Employee[] e = new Employee[ids.size()]; int i=0; for(Integer id : ids){ e[i] = emps.get(id); i++; } return e; } }
Мы используем только аннотации API JAX-RS, такие как @Путь
, @Путь
, Ответ
и т.д. Обратите внимание, что я использую javax.ws.rs.core.Ответ
как объект ответа в некоторых методах, в которых я хочу отправить код состояния HTTP, отличный от 200.
Повторная настройка
До сих пор мы не делали ничего, связанного с Rest Easy, теперь пришло время настроить RestEasy в качестве нашей реализации API JAX-RS для нашего веб-сервиса restful.
Первым шагом является расширение javax.ws.rs.core.Приложение
класс и переопределить несколько методов для внедрения нашей реализации класса обслуживания.
package com.journaldev.jaxrs.resteasy.app; import java.util.HashSet; import java.util.Set; import javax.ws.rs.core.Application; import com.journaldev.jaxrs.service.EmployeeServiceImpl; public class EmployeeApplication extends Application { private Set
Следующим шагом является добавление зависимостей RESTEasy maven в ваш pom.xml файл, как показано ниже.
org.jboss.resteasy resteasy-jaxrs 3.0.13.Final org.jboss.resteasy resteasy-jaxb-provider 3.0.13.Final
Последним шагом является настройка класса сервлета RESTEasy в дескрипторе развертывания в качестве переднего контроллера.
RestEasy-Example org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap resteasy-servlet org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher javax.ws.rs.Application com.journaldev.jaxrs.resteasy.app.EmployeeApplication resteasy-servlet /*
Вот и все. Наш веб-сервис готов. Вы можете видеть, как легко было подключить Rest Easy в качестве нашей реализации JAX-RS для веб-сервиса restful.
Тест веб-службы RESTEasy Restful
Я использую расширение Chrome Postman для тестирования нашего веб-сервиса. Ниже приведены некоторые из тестовых примеров с ответом. Одной общей частью являются заголовки во всех запросах, как показано на рисунке ниже.
- получить Манекен
- добавлять
- получить
- Получить все
- удалить
- добавить ошибку – HTTP-ответ 422
- удалить ошибку – HTTP-ответ 404
Как вы можете видеть, все тесты прошли с честью, наш веб-сервис rest работает нормально.
RestEasy Клиент – пример ResteasyClient
Как я упоминал ранее, RestEasy также предоставляет API для тестирования веб-служб rest с помощью программы java. Для этого нам нужно добавить еще одну зависимость в ваш pom.xml файл.
org.jboss.resteasy resteasy-client 3.0.13.Final
Ниже приведена простая тестовая программа, в которой я программно тестирую наш веб-сервис. Я привожу пример для тестирования методов HTTP GET, POST и DELETE.
package com.journaldev.jaxrs.resteasy.client; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; import com.journaldev.jaxrs.model.Employee; import com.journaldev.jaxrs.model.GenericResponse; public class RestEasyTestClient { public static void main(String[] args) { ResteasyClient client = new ResteasyClientBuilder().build(); //GET example ResteasyWebTarget getDummy = client.target("https://localhost:8080/RestEasy-Example/employee/99/getDummy"); Response getDummyResponse = getDummy.request().get(); String value = getDummyResponse.readEntity(String.class); System.out.println(value); getDummyResponse.close(); //POST example ResteasyWebTarget add = client.target("https://localhost:8080/RestEasy-Example/employee/add"); Employee emp = new Employee(); emp.setId(50);emp.setName("Rick");emp.setSalary(1000); Response addResponse = add.request().post(Entity.entity(emp, MediaType.APPLICATION_XML)); System.out.println(addResponse.readEntity(GenericResponse.class)); System.out.println("HTTP Response Code:"+addResponse.getStatus()); addResponse.close(); addResponse = add.request().post(Entity.entity(emp, MediaType.APPLICATION_XML)); System.out.println(addResponse.readEntity(GenericResponse.class)); System.out.println("HTTP Response Code:"+addResponse.getStatus()); addResponse.close(); //DELETE example ResteasyWebTarget delete = client.target("https://localhost:8080/RestEasy-Example/employee/50/delete"); Response deleteResponse = delete.request().delete(); System.out.println(deleteResponse.readEntity(GenericResponse.class)); System.out.println("HTTP Response Code:"+deleteResponse.getStatus()); deleteResponse.close(); deleteResponse = delete.request().delete(); System.out.println(deleteResponse.readEntity(GenericResponse.class)); System.out.println("HTTP Response Code:"+deleteResponse.getStatus()); deleteResponse.close(); } }
Ниже приведен результат, полученный вышеупомянутой клиентской программой RESTEasy.
true|Employee created successfully|null HTTP Response Code:200 false|Employee Already Exists|EC-01 HTTP Response Code:422 true|Employee deleted successfully|null HTTP Response Code:200 false|Employee Doesn't Exists|EC-02 HTTP Response Code:404 99 Dummy 8976.55
Это все для легкого урока. RESTEasy-это очень простая платформа для простого создания веб-сервисов Restful на java. Вы можете скачать проект по ссылке ниже и поиграть с ним, чтобы узнать больше.