Библиотека — простое клиент-серверное приложение, которое позволяет хранить, просматривать, изменять списки авторов и книг в базе данных. Благодаря применению JavaScript (jQuery, AJAX, JSON, см. main.js) для асинхронного обращения к серверу, все операции выполняются без обновления страницы.
Приложение разработано на Java с использованием технологий:
- сервлет: Spring MVC, JavaServer Pages;
- доступ к данным и валидация: JPA, Hibernate;
- тесты: Spring Test, JUnit, Mockito, Hamcrest, JSONPath;
- веб-интерфейс: jQuery, AJAX, Bootstrap;
- база данных: PostgreSQL;
- контейнер сервлетов: Apache Tomcat.
Архитектура веб-слоя приложения реализована в соответствии со стилем REST. Описание методов доступа приведено на отдельной странице.
Исключительные ситуации, возникающие в приложении, обрабатываются через создание,
трансляцию и обработку исключений. Обработка пользовательских вынесена в единый класс
library.exception.RestExceptionHandler
, где в ответ сервера добавлются
необходимые данные и статусы (включая ясные для восприятия описания ошибок валидации
объекта, переданного запросом POST).
Работа с необрабатываемыми исключениями доверена классу
SimpleMappingExceptionResolver
Spring, который возвращает клиенту
статус 500 Internal Server Error при возникновении такого рода исключений.
Приложение включает 18 модульных тестов для классов-контроллеров и 20 интеграционных тестов, работающих с тестовым набором данных из БД. Сравнение ответов сервера производится средствами Hamcrest и JSONPath, в модульных тестах используются объекты-заглушки Mockito.
REST-интерфейс предоставляет доступ к ресурсам приложения, обмен данными производится в формате JSON. Для наглядности некоторые поля объектов (страна у автора, автор у книги) используют текстовые строки вместо идентификаторов.
Результат всех GET-запросов доступен для просмотра через веб-браузер. Так обращение
к ресурсу /countries
возвращает список стран:
[
{"id": 1, "title": "Германия"},
{"id": 2, "title": "Дания"},
{"id": 3, "title": "Россия"},
{"id": 4, "title": "США"}
]
Запросы POST и DELETE можно выполнить любым REST-клиентом.
Все запросы возвращают в заголовке ответа информацию о результате их исполнения.
Запрос на добавление нового автора может выглядеть так:
заголовок: Content-Type: application/json; charset=UTF-8
тело: {"id": 0, "name": "Лев Толстой", "country": "Россия"}
Ответ приложения:
заголовок: Status Code: 201 Created
Content-Type: application/json; charset=UTF-8
Location: http://library.jelasticloud.com/authors/8
тело: {"id": 8, "name": "Лев Толстой", "country": "Россия"}
Запрос на добавление книги с некорректным именем автора:
заголовок: Content-Type: application/json; charset=UTF-8
тело: {"id": 0, "author": "абв", "title": "Анна Каренина"}
Ответ приложения:
заголовок: Status Code: 406 Not Acceptable
Content-Type: application/json; charset=UTF-8
тело: {
"fieldErrors":
[{"field": "author", "message": "Неизвестный автор."}]
}
ресурс | описание | статусы ответа |
---|---|---|
GET /authors | Возвращает перечень авторов. | 200 |
GET /authors/:id | Возвращает автора с указанным id. | 200 — автор возвращён в теле ответа, 404 — автора с указанным id не существует |
GET /authors/:id/books | Возвращает список книг автора с указанным id. | 200 — книги возвращены в теле ответа, 404 — автора с указанным id не существует |
POST /authors | Добавляет нового автора. В теле ответа возвращает созданного автора, в заголовке - ссылку на созданный ресурс. | 201 — автор создан, 406 — автор с таким именем уже существует, 422 — некорректные параметры автора (длина имени или названия страны) |
DELETE /authors/:id | Удаляет автора с указанным id и возвращает его в теле ответа. | 200 — автор удалён, 404 — автора с таким id не существует |
ресурс | описание | статусы ответа |
---|---|---|
GET /books | Возвращает перечень книг всех авторов. | 200 |
GET /books/:id | Возвращает перечень книг всех авторов. | 200 — книга возвращена в теле ответа, 404 — книги с таким id не существует |
POST /books | Добавляет новую книгу. В теле ответа возвращает созданную книгу, в заголовке - ссылку на созданный ресурс. | 201 — книга создана, 406 — книга с таким названием уже существует у указанного автора, 422 — некорректные параметры книги (длина имени автора или названия книги) |
DELETE /books/:id | Удаляет книгу с указанным id и возвращает её в теле ответа. | 200 — книга удалена, 404 — книги с таким id не существует |
ресурс | описание | статусы ответа |
---|---|---|
GET /countries | Возвращает перечень стран. | 200 |