JAX-RS Клиент с Джерси
1. обзор
Jersey - это платформа с открытым исходным кодом для разработки веб-сервисов RESTFul. У этого также есть большие встроенные клиентские возможности.
В этом кратком руководстве мы рассмотрим создание клиента JAX-RS с использованиемJersey 2.
Для обсуждения создания веб-служб RESTful с использованием Джерси см.this article.
Дальнейшее чтение:
REST API с Джерси и Весной
Создание Restful Web-сервисов с использованием Jersey 2 и Spring.
CORS в JAX-RS
Узнайте, как реализовать механизм общего доступа к ресурсам (CORS) в приложениях на основе JAX-RS.
Джерси Фильтры и перехватчики
Посмотрите, как работают фильтры и перехватчики в структуре Джерси.
2. Maven Зависимости
Начнем с добавления необходимых зависимостей (для клиента Jersey JAX-RS) вpom.xml:
org.glassfish.jersey.core
jersey-client
2.25.1
Чтобы использовать Jackson 2.x в качестве JSON-провайдера:
org.glassfish.jersey.media
jersey-media-json-jackson
2.25.1
Последнюю версию этих зависимостей можно найти вjersey-client иjersey-media-json-jackson.
3. Клиент RESTFul в Джерси
Мы разработаем клиент JAX-RS для использования API-интерфейсов JSON и XML REST, которые мы разработалиhere (нам нужно убедиться, что служба развернута и URL-адрес доступен).
3.1. Класс представления ресурса
Давайте посмотрим на класс представления ресурса:
@XmlRootElement
public class Employee {
private int id;
private String firstName;
// standard getters and setters
}
Аннотации JAXB, такие как@XmlRootElement, требуются только в том случае, если требуется поддержка XML.
3.2. Создание экземпляраClient
Первое, что нам нужно, это экземплярClient:
Client client = ClientBuilder.newClient();
3.3. СозданиеWebTarget
Когда у нас есть экземплярClient, мы можем создатьWebTarget, используя URI целевого веб-ресурса:
WebTarget webTarget
= client.target("http://localhost:8082/spring-jersey");
ИспользуяWebTarget, мы можем определить путь к конкретному ресурсу:
WebTarget employeeWebTarget
= webTarget.path("resources/employees");
3.4. Создание вызова HTTP-запроса
Экземпляр построителя вызовов создается одним из методовWebTarget.request():
Invocation.Builder invocationBuilder
= employeeWebTarget.request(MediaType.APPLICATION_JSON);
Для формата XML можно использоватьMediaType.APPLICATION_XML.
3.5. Вызов HTTP-запросов
Вызов HTTP GET:
Response response
= invocationBuilder.get(Employee.class);
Вызов HTTP POST:
Response response
= invocationBuilder
.post(Entity.entity(employee, MediaType.APPLICATION_JSON);
3.6. Пример клиента REST
Начнем писать простой клиент REST. МетодgetJsonEmployee() извлекает объектEmployee на основе сотрудникаid. JSON, возвращаемыйREST Web Service, десериализуется в объектEmployee перед возвратом.
Свободно используя API JAX-RS для создания веб-цели, конструктора вызовов и вызова HTTP-запроса GET:
public class RestClient {
private static final String REST_URI
= "http://localhost:8082/spring-jersey/resources/employees";
private Client client = ClientBuilder.newClient();
public Employee getJsonEmployee(int id) {
return client
.target(REST_URI)
.path(String.valueOf(id))
.request(MediaType.APPLICATION_JSON)
.get(Employee.class);
}
//...
}
Теперь давайте добавим метод для HTTP-запроса POST. МетодcreateJsonEmployee() создаетEmployee, вызываяREST Web Service для созданияEmployee. Клиентский API внутренне сериализует объектEmployee в JSON перед вызовом метода HTTP POST:
public Response createJsonEmployee(Employee emp) {
return client
.target(REST_URI)
.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(emp, MediaType.APPLICATION_JSON));
}
4. Тестирование клиента
Давайте протестируем нашего клиента с JUnit:
public class JerseyClientLiveTest {
public static final int HTTP_CREATED = 201;
private RestClient client = new RestClient();
@Test
public void givenCorrectObject_whenCorrectJsonRequest_thenResponseCodeCreated() {
Employee emp = new Employee(6, "Johny");
Response response = client.createJsonEmployee(emp);
assertEquals(response.getStatus(), HTTP_CREATED);
}
}
5. Заключение
В этой статье мы представили клиент JAX-RS с использованием Jersey 2 и разработали простой RESTFul Java-клиент.
Как всегда, полный исходный код доступен вthis Github project.