Структура RESTful сервісу з Java Spring для початківців


12

Я відносно новий в галузі навичок розробки веб-Java. У мене є проект, який, на мою думку, став би хорошим кандидатом на послугу RESTful з того, що я мало розумію щодо API. Я намагаюся розібратися в деталях того, як це має бути структуровано, але насправді ніде не потрапляє з точки зору пошуків Google і читання матеріалів, які я вже маю. Я сподіваюся, що ця публікація дасть певну валідацію та / або перенаправлення з точки зору моїх знань та припущень щодо цієї теми.

Я вважаю, що моя служба RESTful буде мати таку структуру:

  • Дані бази даних (SQL).
  • ORM (я використовую відносно непопулярний ORM під назвою CPO, але це було б просто замінено на сплячку у більшості людей).
  • Клас менеджера Java з методами, які спілкуються з ORM для отримання даних
  • Клас / класи Java-контролера, який обробляє картографування запитів і використовує @ResponseBodyдля керування URL-адресою та дією того, як обробляються дані через дієслова HTTP ( http://mysite.com/computers/dell може бути GETзапит зі словом "dell" у URL-адресі - параметр, який повертає масив інформації JSON про комп'ютери Dell).
  • Ця послуга повинна бути виконана за допомогою Spring Boot, або якось мати можливість самостійно стояти і бути незалежною від будь-якого іншого додатка.

Якщо припустити, що вищесказане правильно, тоді я мав би (на дуже базовому рівні) послугу RESTful, яку будь-яка програма може використовувати для споживання та використання даних.

Тому скажіть, що тоді у мене є веб-додаток. Скажімо, я створюю веб-додаток про інформацію про апаратне забезпечення комп'ютера, і я використовую Spring для створення цього веб-додатка. Ось мої припущення:

  • Я маю купу переглядів як JSP, з JSP, що містять HTML, CSS та JavaScript. JavaScript обробляє дзвінки AJAX до контролера цієї програми за потребою (нижче).
  • Цей веб-додаток також має власний контролер для обробки запитів URL-адреси та маршрутизації програми, а потім контролер використовує, скажімо, ModelAndViewоб’єкт чи щось уздовж цих рядків, щоб "поговорити з" контролером служби RESTful, отримати будь-які дані, що передаються , поверніть ці дані назад у вигляд (Javascript, JSP тощо) для відображення.

Я на вірному шляху, тут? Я розумію, що в сервісах RESTful також є аспект аутентифікації, але я ще не там концептуально (і мій проект буде використовуватися в приватній мережі, тому безпека не є пріоритетною на даний момент).

Будь-яке розуміння, критика, знання, відгуки чи роз'яснення високо оцінюються.

Відповіді:


19

Ось один з моїх улюблених початкових прикладів структури вашого додатка для весняного відпочинку.

1. Поділ шарів, кожен шар - це індивідуальний модуль / проект

  • REST API
    • Упакований як війна (Може бути jar, якщо ви використовуєте весняний завантажувач із вбудованим сервером. Документ весняного завантаження чітко пояснює, як розгорнути так звану uber jar . Це смертельно просто.)
    • У ньому є контролери відпочинку, які обробляють запит / відповіді
    • залежить від сервісного модуля нижче
  • Сервіс
    • Упакований як баночка
    • Абстракція бізнес-логіки, цей шар не має уявлення, як спілкуватися з джерелом даних.
    • Він буде автоматично з'єднаний у контролерах відпочинку
    • Залежить від модуля DAO / Repository нижче
  • DAO / сховище
    • Упакований як баночка
    • Говорить безпосередньо до джерела даних, має операції, широко відомі як CRUD. Це може бути простий jdbc, JPA або навіть доступ до файлів.
    • Залежить від модуля домену нижче
  • Домен
    • Упакований як баночка
    • Він має ваші доменні моделі, як правило, класи POJO. Якщо ви використовуєте ORM, вони є об'єктами ORM.
    • Він також може мати DTO (Object Transfer Object), який все ще знаходиться під гарячими дебатами. Користуватися ним чи ні - це ваш дзвінок.
  • Ви можете додати більше модулів, таких як утиліта, інтеграція сторонніх розробників тощо., Але вищезазначене дуже рекомендується мати.

2. Інструменти управління побудовою / залежністю (дуже потрібні ІМХО)

Їх багато, пошук у Google покаже вам. Мені особисто подобається Maven with Spring. Він просто працює для вищевказаної структури проекту.
Також зауважте, що якщо ви використовуєте maven, існує батьківський модуль, який об'єднує всі модулі, обговорені в розділі 1. Усі модулі точки кулі також відповідають модулям maven.

3. Думки про ваш конкретний проект

Оскільки ви використовуєте REST, я настійно рекомендую НЕ використовувати JSP як свій погляд. Ви можете використовувати звичайний HTML5 + Javascript або якийсь популярний фреймворк, наприклад AngularJS.
Якщо ви наполягаєте на використанні JSP, вам знадобиться запровадити ще одну війну (веб-додаток) з контролерами та JSP. Контролер отримає дані (як правило, формат Json / xml), а потім розбере їх до ваших моделей (POJO), щоб ваш JSP міг отримати їх від вашого контролера та зробити дисплей. Опублікування даних з JSP є зворотним, я тут опустив.

Повний посібник ніде не є, оскільки ця тема досить величезна і сильно залежить від вашої конкретної вимоги, але терміни, включені тут, вам достатньо для проведення додаткових досліджень (Google, це так). Сподіваємось, це дасть вам кілька ідей щодо підходу.


1
Домен - це зазвичай шар, що містить бізнес-логіку. Домен зазвичай також називають рівнем, що містить послуги. Об'єкти домену не є звичайними POJO, об'єкт домену повинен містити бізнес-логіку, таку як перевірка аргументів і як така. Напевно, було б краще перейменувати шар на щось інше. Рівень сховища також досить часто використовується для передачі даних з декількох джерел до об'єктів вашого домену.
Енді

Чи будуть також модулі сервісу та сховища весняними проектами?
Гленн Ван Шил

1
@GlennVanSchil Ні, це не повинно бути весняними проектами, коли цілий проект будується, рівень репо / сервісу буде включений у класний шлях. Результат @Autowireбуде працювати.
Minjun Yu

@MinjunYu Дякую за чітку відповідь! Але вашій репо / службі потрібна весна як основна залежність для приміток про службу, сховище чи компонент, я прав?
Гленн Ван Шил

1
@GlennVanSchil Якщо ви покладете всі залежності залежно від джерела в pom.xml материнського модуля, тоді не потрібно додавати будь-яких залежних від пружини залежностей у дочірні модулі (модулі репо / сервісу). Це лише один із способів компонування проектів з декількома модулями навесні. Мета - впорядкувати свій код. Якщо ваш проект не такий великий і не зміниться в осяжному майбутньому, ви можете об'єднати домен, репо, службу в тому ж модулі, який називається "core". Це виглядає ще чистіше.
Minjun Yu

2

Погоджуючись з більшою частиною відповіді від @ Minjun.Y, я думаю, я б трохи підходив до рівня REST та веб-сторінок. З мого читання вашого запитання, я думаю, ви хочете відкрити як зовнішній світ, так і веб-інтерфейс та інтерфейс REST. Мало чого можна отримати, читаючи POJO з бази даних, перетворюючи дані в JSON, а потім назад в POJO для споживання JSP.

Я хотів би зробити так, щоб сервісний рівень виконував всю реальну роботу і додав окремі шари "презентації" для веб-додатків (JSP) та контролера REST. Це були б окремі контролери, в які буде введено службу. Крім того, скористайтеся лише послугою REST і побудуйте всю логіку презентації на стороні клієнта відповідно до попередньої відповіді.

Крім того, я не великий шанувальник модулів Maven. Те, як наш магазин Java реалізував би ваш проект, полягав би в тому, щоб робити регулярні релізи сервісного рівня, а потім робити презентаційні шари залежними від останнього випуску. Про це є місце для обговорення, але це, безумовно, працює для нас. Ми матимемо веб-інтерфейс та інтерфейси REST як окремі проекти Maven, оскільки вони, як правило, живуть у різних .war файлах і, отже, потребують окремого розгортання.

До речі, я б підкреслив необхідність швидкості за допомогою інструментів управління побудовою та залежністю. Як тільки ваш проект виросте до будь-якого розумного розміру, вони вам знадобляться. Безкоштовні інструменти, такі як Maven, Jenkins та Nexus, роблять управління випуском менш проблемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.