Lets’ Play! Play Framework – rest api w 15 minut ;-)

Całkiem niedawno wyszła nowa wersja (2.6) fajnego frameworka Play!

 

Nie jest to moloch pokroju Springa, z milionem dodatkowych modułów „do wszystkiego”, ale to wcale nie oznacza, że jest do niczego 😉

W tym wpisie przedstawię podstawy podstaw z Play! Framework.
Nie będę wchodził w zbędne szczegóły, nie będę tworzył bazy danych, walidacji, wszystkich elementów niezbędnych w pełnej aplikacji, gdyż chcę tylko pokazać jak prosto możemy tworzyć api restowe. W szczegóły zagłębiać się będę w kolejnych postach 😉

Wymagania

  • Zainstalowana Java 8
  • Intellij – przykłady pokazuję na bazie tego IDE – z pluginem scala
  • sbt – warto mieć zainstalowane – http://www.scala-sbt.org/
  • 15 minut wolnego czasu

Konfiguracja

Możemy po prostu ściągnąć przykładowy projekt za pomocą giter8:

ALBO możemy pominąć ten kroczek i sami zbudować tą samą aplikację i na tym się skupię opisując po drodze co i jak 🙂

W Intellij tworzymy nowy projekt, wybieramy projekt typu scala i potem sbt:

Wpisujemy jakąś swoją nazwę (w moim przypadku playrestapi), nie zaznaczamy sources, wersję sbt i scala zostawiamy domyślne:

Klikamy Finish i czekamy aż się nam projekt utworzy.

Otwieramy plik project/plugins.sbt i wpisujemy tam plugin, który doda nam obsługę frameworka Play:

Otwieramy plik build.sbt, w którym włączamy obsługę Play! w aplikacji:

Dodajemy też obsługę Dependency Injection:

 

Czekamy kilka minut i … voila! Mamy projekt z frameworkiem Play! w wersji 2.6.0

Jeśli wychodzi nowa wersja, to w project/plugins.sbt wpisujemy nowszą wersję.

Musimy jeszcze utworzyć katalogi:

  • conf – tutaj będzie konfiguracja aplikacji

  • app – tutaj będzie właściwa aplikacja

W katalogu conf tworzymy (póki co puste) pliki application.conf oraz routes

Implementacja

W katalogu app tworzymy pakiety:

  • pl.najavie.playrestapi.controllers
  • pl.najavie.playrestapi.json

Json

W pakiecie json utworzymy klasę Person:

Od razu rzuca się w oczy prostota – brak pól prywatnych, brak adnotacji itp.

Play posiada w sobie play enhancer’a – https://github.com/playframework/play-enhancer, który w przypadku pola publicznego sam go zamieni na pole prywatne i odpowiednie gettery i settery. Oczywiście nic nie stoi na przeszkodzie, abyśmy sami je sobie tworzyli, ale w tym przypadku jest to nam zupełnie niepotrzebne 🙂

Baza danych

Utworzymy teraz bardzo ułomną, ale działającą bazę danych 😉

Umieszcimy ją w pakiecie pl.najavie.playrestapi.utils:

To mamy obsługę „bazy danych”. Baza jest ułomna, nie sprawdza duplikatów, nie ma kluczy, nie ma niczego, poza dodawaniem, pobieraniem elementów z listy 🙂

Kontroler

Teraz czas na kontroler, czyli miejsce, do którego przychodzi żądanie:

Tutaj kilka słów wyjaśnienia.

Kontroler definiujemy poprzez rozszerzenie klasy Controller. Są dwie wersje tej klasy. Jedna dla Javy (play.mvc.Controller), druga dla Scali (play.api.mvc.Controller). My oczywiście używamy wersji dla Javy 🙂

Definiujemy go jako singleton, poprzez adnotację @Singleton.

Wstrzykujemy implementację naszej ułomnej bazy danych poprzez zwykły

Play się już zajmie stworzeniem tego obiektu. PersonStorage też jest singletonem, żeby mieć jego tylko jedną instancję 😉

Potem mamy już zwykłe metody na dodanie, pobranie listy, pobranie pojedynczego elementu oraz edycję.

Jak pobrać dane z requesta ? Robi to taka linijka:

Play do celów konwersji obiekt-json-obiekt używa biblioteki Jackson – https://github.com/FasterXML/jackson.

Obiekt Json zawiera metody statyczne do konwersji obiektu JsonNode (Jacksonowy obiekt) na obiekt definiowanego typu:

Pobiera nam gotowego JsonNode z requestu.

Proste 😉

Konwersja obiektu na json’a przebiega jeszcze prościej:

Przekonwertuje nam obiekt person na json’a.

Zwracamy wszystko przez metodę ok(….).  (czyli HTTP 200 OK).

Są też inne metody – notFound, badRequest i wiele więcej….

Routing

Pozostał nam jeszcze plik routes, w ktorym zdefiniujemy linki do aplikacji:

tworzymy plik conf/routes

I w nim mamy definicję – jeśli przyjdzie GET na /person wywołaj metodę pl.najavie.playrestapi.controllers.PersonController.getPersons

itd…

To wszystko!

Proste ? 🙂

Uruchomienie

To jeszcze sprawdźmy, czy działa –

Uruchamiamy projekt poprzez komendę:

sbt run

Domyślnie Play nasłuchuje na porcie 9000

No to sprawdzamy, wszystkie endpointy 🙂

Użyjemy curla, ale może być jakikolwiek rest api klient (postman jako plugin dla chrome jest genialny).

 

Najpierw dodanie osoby:

Powinniśmy dostać z powrotem tę osobę.

Dodajmy jeszcze jedną:

I pobierzmy teraz listę osób:

 

Ha! mamy listę osób.

To jeszcze pobierzmy jedną istniejącą:

I jedną nieistniejącą:

Nic. Pusto, a w Postmanie 404 – not found – SUPER!

To jeszcze edycja:

 

Wszystko ładnie działa.

 

W kolejnym wpisie pokażę integrację Play’a z bazą danych, bo dalego z tą ułomną bazą nie pociągniemy 😉

 

 

«
»