Client client = ClientBuilder.newClient();
String name = client.target("http://example.com/webapi/hello")
.request(MediaType.TEXT_PLAIN)
.get(String.class);
|
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
| Назад | Вперёд | Содержание |
Клиентский API JAX-RS предоставляет высокоуровневый API для доступа к любым ресурсам REST, а не только к сервисам JAX-RS. Клиентский API определён в пакете javax.ws.rs.client.
Здесь рассматриваются следующие темы:
Следующие шаги необходимы для доступа к ресурсу REST с помощью клиентского API.
Получите объект интерфейса javax.ws.rs.client.Client.
Настройте объект Client, указав цель (target).
Создайте запрос для цели.
Вызовите запрос.
Клиентский API спроектирован так, чтобы свободно, с объединёнными в цепочку вызовами методов настройки и отправки запроса к ресурсу REST уместиться всего в несколько строк кода.
Client client = ClientBuilder.newClient();
String name = client.target("http://example.com/webapi/hello")
.request(MediaType.TEXT_PLAIN)
.get(String.class);
В этом примере объект клиента сначала создаётся путём вызова метода javax.ws.rs.client.ClientBuilder.newClient. Затем запрос конфигурируется и вызывается цепочкой вызовов методов одной строкой кода. Метод Client.target устанавливает цель с указанным URI. Метод javax.ws.rs.client.WebTarget.request устанавливает тип MIME для возвращаемого объекта. Метод javax.ws.rs.client.Invocation.Builder.get вызывает сервис, используя HTTP-запрос GET, устанавливая тип возвращаемого объекта в String.
Интерфейс Client определяет действия и инфраструктуру, необходимые клиенту REST для использования RESTful веб-сервиса. Объекты Client получены путём вызова метода ClientBuilder.newClient.
Client client = ClientBuilder.newClient();
Используйте метод close, чтобы закрыть объекты Client после выполнения всех вызовов для цели:
Client client = ClientBuilder.newClient();
...
client.close();
Объекты Client являются тяжеловесными объектами. По соображениям производительности ограничьте количество объектов Client в приложении, так как инициализация и уничтожение этих объектов может оказаться дорогостоящим для среды выполнения.
Цель клиента — ресурс REST для определённого URI — представлена объектом интерфейса javax.ws.rs.client.WebTarget. Объект WebTarget получается вызовом метода Client.target с передачей URI целевого ресурса REST.
Client client = ClientBuilder.newClient();
WebTarget myResource = client.target("http://example.com/webapi");
Для сложных ресурсов REST может быть полезно создать несколько объектов WebTarget. В следующем примере базовая цель используется для создания нескольких других целей, которые представляют различные услуги, предоставляемые ресурсом REST.
Client client = ClientBuilder.newClient();
WebTarget base = client.target("http://example.com/webapi");
// WebTarget at http://example.com/webapi/read
WebTarget read = base.path("read");
// WebTarget at http://example.com/webapi/write
WebTarget write = base.path("write");
Метод WebTarget.path создаёт новый объект WebTarget, добавляя URI текущей цели с указанным путём.
Параметры пути в клиентских запросах могут быть указаны в качестве параметров шаблона URI, аналогично параметрам шаблона, используемым при определении URI ресурса в сервисе JAX-RS. Параметры шаблона указываются путём помещения переменной шаблона в фигурные скобки ({}). Вызовите метод resolveTemplate для замены {username}, а затем вызовите метод queryParam, чтобы добавить другую переменную для передачи.
WebTarget myResource = client.target("http://example.com/webapi/read")
.path("{userName}")
.resolveTemplate("userName", "janedoe")
.queryParam("chapter", "1");// http://example.com/webapi/read/janedoe?chapter=1
Response response = myResource.request(...)
.get();
После применения всех параметров конфигурации к объекту цели вызовите один из методов WebTarget.request, чтобы начать формирование запроса. Обычно это достигается передачей в WebTarget.request принятого типа MIME ответа на запрос либо в виде строки типа MIME, либо с использованием одной из констант в javax.ws.rs.core.MediaType. Метод WebTarget.request возвращает объект javax.ws.rs.client.Invocation.Builder — вспомогательный объект, который предоставляет методы для подготовки клиентского запроса.
Client client = ClientBuilder.newClient();
WebTarget myResource = client.target("http://example.com/webapi/read");
Invocation.Builder builder = myResource.request(MediaType.TEXT_PLAIN);
Использование константы MediaType эквивалентно использованию строки, определяющей тип MIME.
Invocation.Builder builder = myResource.request("text/plain");
После установки типа MIME вызовите запрос, вызвав один из методов объекта Invocation.Builder, который соответствует типу HTTP-запроса, ожидаемого целевым ресурсом REST. Это методы:
get()
post()
delete()
put()
head()
options()
Например, если целевой ресурс REST предназначен для HTTP GET-запроса, вызовите метод Invocation.Builder.get. Тип возвращаемого значения должен соответствовать сущности, возвращаемой целевым ресурсом REST.
Client client = ClientBuilder.newClient();
WebTarget myResource = client.target("http://example.com/webapi/read");
String response = myResource.request(MediaType.TEXT_PLAIN)
.get(String.class);
Если целевой ресурс REST ожидает HTTP-запрос POST, вызовите метод Invocation.Builder.post.
Client client = ClientBuilder.newClient();
StoreOrder order = new StoreOrder(...);
WebTarget myResource = client.target("http://example.com/webapi/write");
TrackingNumber trackingNumber = myResource.request(MediaType.APPLICATION_XML)
.post(Entity.xml(order), TrackingNumber.class);
В предыдущем примере возвращаемый тип является пользовательским классом и извлекается путём установки типа в методе Invocation.Builder.post(Entity<?> entity, Class<T> responseType) ,
Если возвращаемый тип является коллекцией, используйте javax.ws.rs.core.GenericType<T> в качестве параметра типа ответа, где T — тип коллекции:
List<StoreOrder> orders = client.target("http://example.com/webapi/read")
.path("allOrders")
.request(MediaType.APPLICATION_XML)
.get(new GenericType<List<StoreOrder>>() {});
Этот пример показывает, как вызывается цепочка методов клиентского API, чтобы упростить настройку и вызов запросов.
| Назад | Вперёд | Содержание |
Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены.
Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)