Автор оригинала: 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 Map emps = 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. Вы можете скачать проект по ссылке ниже и поиграть с ним, чтобы узнать больше.