Przesyłanie strumieni multimediów w oparciu o UserMedia, WebRTC i ASP.NET SignalR
http://pracait.com/aktualnosci/programista-cc-czerwiec-2015/

REST API w 60 s

LoopBack to potężny, wysoce rozszerzalny, open-source’owy framework oparty na Node.js. Przy jego pomocy szybko stworzysz w pełni funkcjonalne REST’owe API zupełnie od zera. Framework jest wysoko-poziomowy i dużą część operacji wykonasz korzystając jedynie z wiersza poleceń (rys. 1). Bez większego wysiłku zadbasz o bezpieczeństwo dostępu do danych, zapiszesz je w wybranej bazie danych oraz wygodnie udostępnisz przy pomocy API.

Rys. 1. Zrzut ekranu z konsolowego kreatora LoopBack

Rys. 1. Zrzut ekranu z konsolowego kreatora LoopBack

Modele – serce LoopBack

Modele to kluczowa część frameworka. Reprezentują źródła danych, np. bazy danych lub serwisy jak REST czy SOAP. Zrealizowane są w postaci obiektów JavaScript, do których istnieje dostęp poprzez API Node lub REST.

Definicja modelu zajmuje chwilę. Najprostszy sposób polega na wykorzystaniu generatora slc, który przeprowadzi programistę przez kolejne etapy, podczas których zdefiniuje konkretne właściwości modelu. Jedną z najwygodniejszych cech frameworka jest fakt, że po utworzeniu modelu, automatycznie zostanie stworzone API REST’owe, z pełnym zestawem operacji do tworzenia, aktualizacji, usuwania i odczytu danych.

Każda aplikacja LoopBack posiada zbiór wbudowanych modeli, które są często stosowane. Dzięki temu programista nie musi wykonywać nadmiarowej pracy. Należą do nich m.in.:

  • Application model przechowuje ustawienia i dane konkretnej aplikacji.
  • User model reprezentuje użytkowników, umożliwia ich rejestrację, autentykację i autoryzację.
  • Access control models ACL, AccessToken, Scope, Role, RoleMapping, to modele przeznaczone do kontrolowania dostępu do aplikacji, jej zasobów i metod.
  • Email model umożliwia wysyłanie wiadomości elektronicznych do użytkowników.

Programista ma możliwość zdefiniowania własnych modeli na podstawie już istniejących. Przykładowo rozszerzając model User, może stworzyć bardziej konkretne modele jak Client czy Customer. Najczęściej wykorzystywanym modelem bazowym jest PersistedModel. Umożliwia on zapis i odczyt danych w popularnych bazach danych, przy pomocy technologii connectors. Bazą dla wszystkich modeli programisty, które nie posiadają semantyki CRUD jest Model.

Connectors to warstwa abstrakcji bazy danych, która umożliwia jej łatwą i wysoko-poziomową obsługę. Connectors wspierają współpracę z takimi bazami danych jak: MongoDB, MySQL, Oracle, PostgreSQL, Redis, SQL Server. Typowo aplikacja nie korzysta z nich bezpośrednio i posługuje się wyższą warstwą abstrakcji. Wybranie bazy danych, z którą będzie współpracować aplikacja sprowadza się jedynie do skonfigurowania odpowiedniego konektora. Po tej czynności, programista może wykonywać operacje CRUD na wysoko-poziomowych modelach, a cała logika obsługi bazy danych zostaje wykonana automatycznie. Operacje można wywoływać bezpośrednio w kodzie JavaScript lub poprzez REST’owe API, które zostaje wygenerowane przez framework. Wniosek z tego taki, że bardzo duża i czasochłonna praca związana z komunikacją różnych warstw dostępu do danych, jest zautomatyzowana przez framework. Programista musi jedynie dokonać konfiguracji.

LoopBack dostarcza wygodnego systemu filtrowania danych, którego można dokonać zarówno na poziomie kodu aplikacji, jak i na poziomie REST’owego API poprzez dołączenie odpowiednich parametrów do URL. Framework wspiera poniższe filtry, które można ze sobą łączyć.

  • Fields filter – zwrócenie danych dotyczących wyłącznie wybranych pól.
  • Include filter – zwrócenie wyników modeli, które są połączone daną relacją, np. belongsTo lub hasMany.
  • Limit filter – ograniczenie maksymalnej liczby zwróconych wyników.
  • Order filter – definiuje sposób sortowania danych.
  • Skip filter – ominięcie określonej liczby wyników.
  • Where filter – umożliwia zdefiniowanie zbioru warunków logicznych. Filtr podobny jest do klauzuli WHERE w języku SQL.

Tworzenie relacji

Niezależne modele są łatwe w zrozumieniu i obsłudze, jednak rzeczywistość nie jest tak prosta. Przeważnie modele są ze sobą powiązane, np. klient posiada wiele zamówień, a każde zamówienie musi należeć do jakiegoś klienta. LoopBack wspiera tworzenie relacji, dba o ich spójność i udostępnia API do tworzenia zapytań i filtrów opartych o nie.

Relacje między modelami można definiować przy pomocy narzędzia konsolowego. Programista zostanie przeprowadzony przez kolejne etapy tworzenia relacji, wskaże modele, rodzaje relacji oraz opcjonalne ustawienia. Wybrane relacje przedstawiono poniżej.

  • BelongsTo – relacja jeden do jednego. Każda instancja modelu należy do jednej instancji innego modelu, np. zamówienie należy do klienta.
  • HasOne – połączenie jeden do jednego. Każda instancja modelu posiada instancję innego modelu.
  • HasMany – połączenie jeden do wielu. Każda instancja modelu może posiadać wiele instancji innego modelu. Przykładowo klient może mieć wiele zamówień.
  • HasManyThrough – relacja wiele do wielu. Dany model może być w relacji z innym modelem, poprzez model pośredniczący. Przykładowo pacjent może być w relacji z lekarzem, ale pośrednikiem jest model wizyty, która posiada dodatkowe informacje o relacji.
  • HasAndBelongsToMany – relacja wiele do wielu bez dodatkowego modelu pośredniczącego.

Rozszerzenie logiki aplikacji

LoopBack wykonuje wiele pracy za programistę. Każda aplikacja posiada unikalne przeznaczenie i cechy, a więc konieczne jest stworzenie unikalnej logiki przetwarzania danych i wykonywania dodatkowych operacji, przed zwróceniem odpowiedzi do klienta. Framework posiada trzy sposoby definiowania własnej logiki.

Pierwsza metoda polega na dodaniu logiki do modeli. W ramach tego sposobu można stworzyć poniższe komponenty.

  • Remote methods, do których można odnieść się przez zdalne API. Metody zdalne są wykorzystywane do wykonywania operacji niestandardowych, które nie zostały przewidziane przez domyślnie wygenerowane API.
  • Remote hooks, to metody, które będą wykonane tuż przed lub tuż po wykonaniu zdalnej metody.
  • Operation hooks, to metody, które nie są związane z określoną metodą zdalną, ale wywoływane są w momencie określonej operacji na danych (CRUD), którą uruchomiła dowolna inna metoda.
  • Connector hooks, to operacje, które ingerują w sposób działania konektorów.

Drugi sposób definiowania własnej logiki sprowadza się do stworzenia skryptów uruchamianych przy starcie aplikacji (boot scripts). Typowo wykorzystywane są do niestandardowej inicjalizacji różnych komponentów. Stworzenie boot scripts może być wykonane przy pomocy konsolowego narzędzia, które przyspieszy proces i zminimalizuje szanse popełnienia błędów.

Trzeci i ostatni sposób dostosowania logiki aplikacji, polega na definicji warstw pośredniczących. To funkcje wykonywane, w momencie, gdy realizowane są zapytania HTTP. Warstwa pośrednicząca LoopBack jest taka sama jak we frameworku Express. Wspierane są następujące rodzaje middleware:

  • pre-processing middleware, które wspiera niestandardową logikę aplikacji,
  • dynamic request handling middleware, które serwuje dynamiczne odpowiedzi, np. strony HTML wygenerowane na podstawie szablonów,
  • static middleware, które serwuje statyczne zasoby po stronie klienta,
  • error-handling middleware, które odpowiada za obsługę błędnych żądań.

Obsługa użytkowników

Użytkownicy to kluczowy element aplikacji. Jak napisałem wcześniej, framework dostarcza wbudowanego modelu User, który reprezentuje użytkowników. Dostarcza on funkcjonalności wspierających:

  • rejestrację i potwierdzenie adresu e-mail,

  • logowanie i wylogowanie,

  • tworzenie żetonów dostępu,

  • resetowanie hasła.

Większość aplikacji musi kontrolować kto może uzyskać dostęp do danych lub serwisów i na jakich warunkach. Typowo dostęp do chronionych danych wymaga zalogowania się przez użytkowników lub uzyskania żetonów dostępu przez zewnętrzne aplikacje. Proces zabezpieczania dostępu do danych składa się z poniższych etapów.

  1. Definicja ról użytkowników, których wymaga aplikacja. Przykładowo można stworzyć role dla użytkowników anonimowych, zalogowanych, administratorów.
  2. Definicja dostępu do metod modeli dla danych ról. Przykładowo użytkownicy anonimowi będą mogli odczytać jedynie część danych, zalogowani uzyskają dostęp do całości danych, a administratorzy będą mogli je edytować.

Przez powyższe etapy przeprowadza programistę specjalne narzędzie, w którym należy dokonać wyboru ról i przypisać im uprawnienia do wykonywania operacji na danych modelach.

Podsumowanie

LoopBack to wysoko-poziomowy, złożony i łatwo rozszerzalny framework oparty o Node.js. W znacznym stopniu odciąża programistów, udostępniając konsolowe narzędzia do jego obsługi. Posiada wbudowane, często powtarzające się funkcjonalności, które sprawiają, że proces rozwoju i tworzenia aplikacji staje się szybki, a liczba potencjalnych błędów zostaje zminimalizowana.

W artykule opisałem jedynie podstawowe komponenty frameworka. Ich potęga tkwi w tym, że domyślne zachowanie będzie wystarczające dla wielu deweloperów, jednak nic nie stoi na przeszkodzie, aby je rozszerzyć lub zmodyfikować.

Funkcjonalności i bonusów ułatwiających pracę jest znacznie więcej. LoopBack wspiera programistów zestawem SDK:

  • iOS SDK,
  • Android SDK,
  • AngularJS JavaScript SDK,
  • Isomorphic LoopBack.

Ponadto dla każdej aplikacji zostanie stworzona dokumentacja oraz eksplorator API (rys. 2). Można w nim testować zapytania, wykorzystując podstawowe metody HTTP i tworzyć własne filtry. Żadnych dodatkowych wtyczek i konfiguracji. Wszystko zrobi się samo.

Rys. 2. Zrzut ekranu z eksploratora API

Rys. 2. Zrzut ekranu z eksploratora API

Mam nadzieję, że przykułem Twoją uwagę do technologii LoopBack. Jeśli jesteś zainteresowany i sądzisz, że może właśnie tego potrzebujesz, wejdź na stronę https://docs.strongloop.com.


 

Chodorek Damian

http://damianchodorek.com/ | http://brieftip.pl/

Świeżo upieczony absolwent AGH w Krakowie. Obecnie pracuje na stanowisku Junior Android Developer w firmie Grupa Wirtualna Polska. Bloger, pasjonat programowania i rozwoju osobistego.

Comments are closed.