Реалізуємо RESTful Web Service на java

Доброго дня всім хаброжителям!

Приводом до написання статті стало те, що на мій великий подив на хабрі я не знайшов статті про реалізацію RESTful Web Service на Java, може, звичайно, погано шукав. Так написано про RESTful web services дуже багато, але якось так, щоб простенько з прикладами коду, робочий сервіс, не так вже й легко знайти і не тільки на хабрі ...

Взагалі з REST я познайомився зовсім недавно, не більше місяця тому. Тож буду дуже вдячний за поради, поправки та критику!

Розібратися було і так нескладно, але я думаю аналогічний пост мені б дуже допоміг і сильно прискорив процес навчання! Тим більше, якщо ви розробник-початківець і багато про що тільки чули, а руками ніколи не чіпали.

На мою першу враження: дійсно річ дуже зручна, а головне дуже проста, ще й якщо використовувати JSON, а не XML, ну принаймні мені так здалося після досвіду роботи з SOAP і WSDL. Ну, так про це я думаю і так всі знають, хто хоч трохи працював із веб-сервісами.

Отже, хто зацікавився реалізацією, прошу під кат Одразу обмовимося:

1. весь код, звичайно, у статті не викладеш і про нього не розкажеш; 2. версія проектика, звичайно, не фінальна і, як я вже говорив вище, буду дуже вдячний за зауваження та поради; 3. звичайно ж, є баги.

І так, почнемо по порядку:

ПЗ вибиралося за дуже простим принципом — що простіше, то краще. Так, замість MySQL для навантажених сервісів без необхідності робити складні запити в базу, дуже добре використовувати MongoDB, ну, принаймні з цього приводу багато написано, та й знову ж таки зручніше її використовувати так як на вході той же JSON.

2. В принципі що буде робити наш сервіс - тут все дуже банально: сервіс будепрацювати з однією табличкою в БД - вставляти, апдейтати, видаляти, ну і, звичайно ж, отримувати записи списком або по Id. Звичайно ж, хотілося б мати можливість параметризованого запиту на отримання списку записів, не погано було б зробити «красивий» урл до сервісу, прикрутити якийсь інтерсептор, щоб, наприклад, перевіряти права користувача на доступ до сервісу, або щось інше робити перед запуском сервісу, та й якось централізовано управляти кодами помилок у відповідях від сервера.

4 стандартні статуси, які ми додатково оброблятимемо (наприклад, додавати версію наших веб сервісів у відповідь і при помилці — наш код помилки):

200 - Successful; 401 - Not Authorized; 404 - Not Found; 500 - Server error during operation.

3. Реалізація (код на гітхабі тут):

Самі веб-сервіси:

Все досить просто — 4 веб сервіси в залежності від URI і методу яким цей URI смикається, є об'єкт DAO, який підключається до beans.xml і доступ до заголовків запиту, щоб дістати для прикладу кастомний заголовок «version».

Штука, яка відпрацьовує перед тим, як викликається сервіс:

Тут у методі validate() можна перевіряти якісь умови, суто для тесту додано перевірку кастомного заголовка в запиті ідентифікатор сесії «ss_id», ну, і з першого разу навіть із цим заголовком буде падати 401.

Загальний обробник exceptions:

Щось вже забагато коду для посту, є ще допоміжний клас для формування відповіді серверу та глобальний enum для зберігання наших кодів помилок. Так, дескриптор розгортання і beans.xml все-таки наведу тут:

Тут основний інтерес представляє підключення екшн сервлету від Apache - CXFServlet і стандартного спринговогоContextLoaderListener.

Тут, власне, задали потрібні конфігураційні файли для CXF, підключили DAO об'єкт, наш передобробник та обробник виняткових ситуацій, звичайно ж, сам бін із сервісами і задали корінь для сервісів.

Для того щоб посмикати сервіси я використовував REST Console 4.0.2 плагін для хрому - штука досить проста, головне задати потрібні ендпоінт, кастомні заголовки (як я вже говорив без ss_id завжди буде падати 401) і контент тип. Для прикладу:

І останнє, хотілося мати «красивий», краще скажемо потрібний нам урл до веб-сервісів. Звичайно, можна поправити server.xml або використовувати який-небудь тул для urlRewrite, але на мій найпростіший спосіб це запакувати наш веб-архів в ear і задати інший рут для наших веб-сервісів в application.xml, але в рамках даного посту я цього вже робити не буду.

PS: Сподіваюся, що цей пост буде корисним тим, хто хоче познайомитися з Java RESTful web services, а досвідченіші порадять і покритикують!

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»