<p>API (Application Programming Interface) — программный интерфейс приложения. Это набор инструментов, который позволяет одним программам работать с другими. API предусматривает, что программы могут работать на разных компьютерах. В этом случае требуется организовать интерфейс API так, чтобы ПО могло запрашивать функции друг друга через сеть.</p>
<p>API должен учитывать, что программы могут быть написаны на разных языках, поэтому для общения используется независимый от языка формат обмена данными. В этом упражнении мы будем работать с форматом <ahref="https://ru.wikipedia.org/wiki/JSON">JSON</a>.</p>
<p>REST API позволяет использовать для общения между программами протокол HTTP. Другими словами, серверное приложение дает доступ к своим данным клиентскому приложению по определенному URL. Чтобы произвести нужные действия с ресурсом, нужно обратиться к нему определённым способом. Для этого используются четыре HTTP метода — GET, POST, PATCH, DELETE. Рассмотрим на примере работы с пользователем:</p>
<ul>
<lidata-marpit-fragment="1">GET-запрос на <em>/api/v1/users</em> вернёт список всех пользователей</li>
<lidata-marpit-fragment="2">GET-запрос на <em>/api/v1/users/{id}</em> вернёт данные конкретного пользователя</li>
<lidata-marpit-fragment="3">POST-запрос на <em>/api/v1/users</em> создаёт нового пользователя</li>
<lidata-marpit-fragment="4">PATCH-запрос на <em>/api/v1/users/{id}</em> обновляет данные пользователя</li>
<lidata-marpit-fragment="5">DELETE-запрос на <em>/api/v1/users/{id}</em> удаляет пользователя</li>
</ul>
<h2>Ссылки</h2>
<ul>
<lidata-marpit-fragment="6"><ahref="https://javalin.io/documentation#handler-groups">Метод crud() — используется для разработки API. Он автоматически добавляет в приложение пять маршрутов для CRUD операций</a></li>
<lidata-marpit-fragment="7"><ahref="https://ebean.io/apidoc/11/io/ebean/text/json/JsonContext.html#toJson-java.lang.Object-">Получение данных из базы в виде JSON представления при помощи метода DB.json().toJson()</a></li>
<lidata-marpit-fragment="8"><ahref="https://ebean.io/apidoc/11/io/ebean/text/json/JsonContext.html#toBean-java.lang.Class-java.lang.String-">Получение экземпляра модели из JSON представления при помощи метода DB.json().toBean()</a></li>
<lidata-marpit-fragment="9"><ahref="https://javadoc.io/doc/io.javalin/javalin/latest/io/javalin/http/Context.html">Метод контекста body() — получает тело запроса в виде строки</a></li>
<lidata-marpit-fragment="10"><ahref="https://javadoc.io/static/io.javalin/javalin/4.1.1/io/javalin/http/Context.html#json(Object)">Метод контекста json() — устанавливает тип содержимого application/json в ответе и отправляет JSON строку в теле ответа</a></li>
<lidata-marpit-fragment="11"><ahref="https://www.postman.com/">Postman — инструмент для тестирования API</a></li>
</ul>
<h2>src/main/java/exercise/App.java</h2>
<h2>Задачи</h2>
<ul>
<lidata-marpit-fragment="12">Допишите метод <code>addRoutes()</code>. Добавьте в приложение пять маршрутов для CRUD пользователя, которые были рассмотрены выше. Для этого удобно воспользоваться методом <code>crud()</code>, который автоматически добавит эти маршруты.</li>
<p>Допишите метод <code>getAll()</code>, который возвращает список всех пользователей в виде JSON-представления. Для преобразования списка пользователей в JSON можно воспользоваться методом <code>DB.json().toJson()</code></p>
</li>
<lidata-marpit-fragment="14">
<p>Допишите метод <code>getOne()</code>, который возвращает конкретного пользователя в виде JSON-представления.</p>
</li>
<lidata-marpit-fragment="15">
<p>Допишите метод <code>create()</code>, который создаёт нового пользователя из полученного JSON-представления и добавляет его в базу. Для получения экземпляра модели из JSON-представления можно воспользоваться методом <code>DB.json().toBean()</code>.</p>
</li>
<lidata-marpit-fragment="16">
<p>Допишите метод <code>update()</code>, который обновляет данные пользователя в базе данными из полученного JSON-представления.</p>
</li>
<lidata-marpit-fragment="17">
<p>Допишите метод, который удаляет пользователя из базы.</p>
</li>
<lidata-marpit-fragment="18">
<p>Запустите свое приложение и попробуйте отправлять различные запросы при помощи Postman.</p>
</li>
</ul>
<h2>Подсказки</h2>
<ul>
<lidata-marpit-fragment="19">
<p>Метод <code>crud()</code> автоматически добавляет в приложение пять маршрутов для CRUD операций: получение всех сущностей <code>getAll()</code>, получение одной сущности <code>getOne()</code>, создание <code>create()</code>, редактирование <code>update()</code> и удаление <code>delete()</code> сущности.</p>
</li>
<lidata-marpit-fragment="20">
<p>Чтобы отправить JSON строку в теле ответа, используйте метод контекста <code>json()</code>.</p>
</li>
<lidata-marpit-fragment="21">
<p>В классе <code>User</code> есть метод <code>setId()</code>, который добавляет id пользователя в экземпляр модели. Вы можете воспользоваться им для обновления пользователя в базе. Для этого нужно установить нужный id и вызвать метод <code>update()</code> на модели.</p>
</li>
</ul>
<h2>Самостоятельная работа</h2>
<ul>
<lidata-marpit-fragment="22">Добавьте валидацию данных при создании пользователя в метод <code>create()</code>. Условия валидации для данных пользователя установите по своему желанию. Можно взять те же условия, которые были в предыдущем задании. Так как данные пользователя мы получаем в виде JSON-строки, для валидации всего тела запроса целиком можно воспользоваться методом <ahref="https://javadoc.io/static/io.javalin/javalin/4.1.1/io/javalin/http/Context.html#bodyValidator(Class)">bodyValidator()</a>. Пример работы этого метода можно посмотреть в <ahref="https://javalin.io/documentation#validation">разделе Валидация документации Javalin</a></li>