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

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


Листинг 15.24. Метод getBook службы BookRestService

>//…

>@GET

>@Path("{id}")

>public Response getBook(@PathParam("id") String id) {

>··Book book = em.find(Book.class, id);


>··if (book == null)

>····throw new NotFoundException();


>··return Response.ok(book). build();

>}

>//…

Аннотация @Path указывает подпуть внутри уже заданного пути на уровне класса. При использовании синтаксиса {id} URL-элемент связывается с параметром метода. Воспользуемся cURL для доступа к книге с идентификатором 601 и получения JSON-представления:

>$ curl — X GET — H "Accept: application/json" 

>····http://localhost:8080/chapter15-service-1.0/rs/book/601

>{"description":"Научно-фантастическая книга","id":"1", 

>····"illustrations":false,"isbn":"1-84023-742-2","nbOfPage":354, 

>····"price":12.5,"title":"H2G2"}

Изменив свойство заголовка Accept, мы сможем в этом же коде вернуть XML-представление книги с идентификатором 601:

>$ curl — X GET — H "Accept: application/xml" 

>····http://localhost:8080/chapter15-service-1.0/rs/book/601

>

>····standalone="yes"?>Научно-фантастическая 

>····книга601false 

>····1-84023-742-235412.5 

>····H2G2


Получение всех книг

Для получения из базы данных всех книг код из листинга 15.25 использует запрос TypedQuery, результат которого устанавливается в класс Books. Не забывайте, что этот класс расширяет ArrayList и дает XML-представление списка благодаря аннотациям JAXB. В результате получаем ответ с кодом состояния 200 — Хорошо, причем в теле сообщения содержится представление книг.


Листинг 15.25. Метод getBooks службы BookRestService

>//…

>@GET

>public Response getBooks() {

>··TypedQuery query = em.createNamedQuery(Book.FIND_ALL, Book.class);

>··Books books = new Books(query.getResultList());

>··return Response.ok(books). build();

>}

>//…

Опять же, если вы пожелаете быстро протестировать код с помощью cUrl, откройте командную строку и введите в нее следующие команды, чтобы получить представление списка книг либо в XML, либо в JSON:

>$ curl — X GET — H "Accept: application/json" 

>http://localhost:8080/chapter15-service-1.0/rs/book

>$ curl — X GET — H "Accept: application/xml" 

>http://localhost:8080/chapter15-service-1.0/rs/book


Удаление книги

Метод deleteBook() в листинге 15.26 соответствует формату метода getBook(), так как использует подпуть и ID в качестве параметра. Единственное отличие от метода getBook() заключается в том, что во втором случае применяется HTTP-операция DELETE (а не GET). Если книга не найдена в базе данных, то генерируется исключение NotFoundException, в противном случае книга удаляется и возвращается код состояния 204 — Нет содержимого.


Листинг 15.26. Метод deleteBook службы BookRestService

>//…

>@DELETE

>@Path("{id}")

>public Response deleteBook(@PathParam("id") String id) {

>··Book book = em.find(Book.class, id);


>··if (book == null)

>····throw new NotFoundException();

>··em.remove(book);

>··return Response.noContent(). build();

>}

>//…

Если бы мы воспользовались развернутым режимом вывода cURL (с аргументом — v), то увидели бы отправку запроса DELETE. В ответе же присутствует код состояния 204 — Нет содержимого. Он указывает, что ресурс больше не существует:

>$ curl — X DELETE http://localhost:8080/chapter15-service-1.0/rs/book/601 — v > DELETE /chapter15-service-1.0/rs/book/601 HTTP/1.1

>> User-Agent: curl/7.23.1 (x86_64-apple-darwin11.2.0) libcurl/7.23.1

>> Host: localhost:8080

>> Accept: */*

>>

>< HTTP/1.1 204 No Content

>< Server: GlassFish Server Open Source Edition 4.0

Конфигурирование JAX-RS

Перед развертыванием службы BookRestService и сущности Book нам потребуется зарегистрировать в Jersey паттерн url; это делается для перехватывания HTTP-вызовов, идущих к службам. Таким образом, запросы, отсылаемые к пути /rs, будут перехватываться Jersey. Вы можете либо задать этот паттерн url при конфигурировании сервлета Jersey в файле web.xml, либо использовать аннотацию @ApplicationPath (листинг 15.27). Класс ApplicationConfig должен расширять javax.ws.rs.core.Application и определять все веб-службы в стиле REST (здесь — c.add(BookRestService.class)), а также выполнять все прочие необходимые расширения (c.add(MOXyJsonProvider.class)).


Листинг 15.27. Класс ApplicationConfig, объявляющий URL-паттерн для /rs

>@ApplicationPath("rs")

>public class ApplicationConfig extends Application {

>··private final Set> classes;


>··public ApplicationConfig() {

>····HashSet> c = new HashSet<>();

>····c.add(BookRestService.class);

>····c.add(MOXyJsonProvider.class);

>····classes = Collections.unmodifiableSet(c);

>··}


>··@Override

>··public Set> getClasses() {

>····return classes;

>··}

>}

Этот класс должен находиться где-то в вашем проекте (конкретный пакет не имеет значения), и благодаря аннотации @ApplicationPath он будет отображать запросы на URL-шаблон /rs/*. Это означает, что всякий раз, когда очередной URL будет начинаться с /rs/, Jersey будет его обрабатывать. Действительно, во всех тех примерах, которые я использовал в cURL, все URL ресурсов начинались с /rs:


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.