Изучаем Java EE 7 - [248]

Шрифт
Интервал


Таблица 15.8. Основные классы и интерфейсы из пакета javax.ws.rs.client
Класс/интерфейсОписание
ClientЭто основная входная точка для текучего API, используемого для построения и выполнения клиентских ответов
ClientBuilderВходная точка для клиентского API, используемая для начальной загрузки экземпляров Client
ConfigurableКлиентская конфигурационная форма Client, WebTarget и Invocation
EntityИнкапсулирует объект сообщения, включая ассоциированную информацию о вариантах
InvocationЗапрос, готовый к исполнению
Invocation.BuilderПостроитель вызовов клиентского интерфейса
WebTargetЦель ресурса, идентифицируемая URI ресурса

Пошагово рассмотрим этот список, чтобы разобраться, как работать с новым API. Затем объединим все приобретенные знания и протестируем веб-службу в стиле REST.


Начальная загрузка клиента

Основной входной точкой в данный API является интерфейс Client. Он конфигурирует HTTP-соединения и управляет ими. Кроме того, это фабрика для WebTargets, поэтому данный интерфейс обладает набором методов для создания ссылок на ресурсы и вызова ресурсов. Экземпляры Client создаются с помощью одного из статических методов класса ClientBuilder:

>Client client = ClientBuilder.newClient();

В примере показан способ создания экземпляра Client с помощью стандартной реализации. Мы также можем запросить конкретную специальную реализацию Client, воспользовавшись нужной конфигурацией. Например, следующий код регистрирует поставщика CustomCustomerReader (см. листинг 15.17) и устанавливает некоторые свойства:

>Client client = ClientBuilder.newClient();

>client.configuration(). register(CustomCustomerReader.class). setProperty("MyProperty", 1234);


Цели и вызовы

Имея Client, вы можете выбрать в качестве цели URI определенной веб-службы в стиле REST и вызывать в ней конкретные HTTP-методы. Именно для таких операций нужны интерфейсы WebTarget и Invocation. Методы Client.target() — это фабрики для веб-целей, представляющие конкретный URI. Вы выстраиваете и выполняете запросы из экземпляра WebTarget. Можно создать WebTarget со строковым представлением URI:

>WebTarget target = client.target("http://www.myserver.com/book");

Можно также получить WebTarget от java.net.URI, javax.ws.rs.core.UriBuilder или javax.ws.rs.core.Link:

>URI uri = new URI("http://www.myserver.com/book");

>WebTarget target = client.target(uri);

Теперь у вас есть URI, на который нужно нацелиться. Переходим к построению HTTP-запроса. WebTarget обеспечивает такие операции с помощью Invocation.Builder. Чтобы инициировать простой HTTP-запрос GET к URI, достаточно написать:

>Invocation invocation = target.request(). buildGet()

Invocation.Builder позволяет строить запросы GET, а также POST, PUT и DELETE. Кроме того, можно строить запрос для различных MIME-типов и даже добавлять параметры с информацией о пути, запросе и матрице. Для методов PUT и POST необходимо передавать параметр Entity, представляющий полезную нагрузку для отправки веб-службе в стиле REST:

>target.request(). buildDelete();

>target.queryParam("author", "Eloise"). request(). buildGet();

>target.path(bookId). request(). buildGet();

>target.request(MediaType.APPLICATION_XML). buildGet();

>target.request(MediaType.APPLICATION_XML). acceptLanguage("pt"). buildGet();

>target.request(). buildPost(Entity.entity(new Book()));

Этот код просто строит Invocation. Затем понадобится вызвать метод invoke() для активизации вашей удаленной веб-службы в стиле REST и получить обратно объект Response, который определяет соглашение (контракт) с возвращаемым экземпляром. Именно Response вы и применяете:

>Response response = invocation.invoke();

Итак, если собрать все вместе, то следующие строки кода понадобятся для вызова метода GET в удаленной REST-службе, расположенной по ссылке http://www.myserver.com/book. При этом возвращается значение text/plain:

>Client client = ClientBuilder.newClient();

>WebTarget target = client.target("http://www.myserver.com/book");

>Invocation invocation = target.request(MediaType.TEXT_PLAIN). buildGet();

>Response response = invocation.invoke();

Благодаря API построителя и некоторым полезным сокращениям аналогичное поведение можно выразить всего в одной строке кода:

>Response response = 

>····ClientBuilder.newClient(). target("http://www.myserver.com/book") 

>····.request(MediaType.TEXT_PLAIN). get();

Далее рассмотрим, как манипулировать Response и использовать объекты.


Использование ответов

Класс Response позволяет потребителю в определенной степени управлять HTTP-ответами, возвращаемыми от веб-службы в стиле REST. С помощью этого API можно проверять код состояния HTTP, заголовки, cookie и, конечно же, тело сообщения (то есть объект, или сущность). В коде, приведенном ниже, используются встроенные методы для обращения к определенной низкоуровневой информации о HTTP — в частности, они позволяют узнать код состояния, длину тела сообщения, дату отправки или любой HTTP-заголовок:

>assertTrue(response.getStatusInfo() == Response.Status.OK);

>assertTrue(response.getLength() == 4);

>assertTrue(response.getDate()!= null);

>assertTrue(response.getHeaderString("Content-type"). equals("text/plain"));


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.