SlideShare a Scribd company logo
Angular Restmod
wygodny sposób na komunikację z API
Marcin Gajda
Front-End developer
The Software house
Angular Restmod?
● implementuje Active Record
● mapuje dane z REST API na modele
● pozwala korzystać z kolekcji modeli
● automatyzuje tworzenie relacji
REST API – bezstanowy interfejs programistyczny
oparty o model klient - serwer i protokół HTTP.
Relacje?
● zależności między obiektami
● obsługa “1 do 1” oraz “1 do n”
● wsparcie dla modeli “inline”
● automatyczne rzutowanie na typ
● generowanie adresów API
Konfiguracja Restmoda
● system wstawek
● wstawka może składać się z:
○ ogólnej konfiguracji ($config)
○ uchwytów zdarzeń ($hooks)
○ rozszerzeń ($extend)
○ ustawień dla atrybutów
● podział na:
○ konfiguracja globalna
○ konfiguracja “per definicja”
Ogólne ustawienia ($config)
Pozwala na ustawienie m.in:
● nazwy klucza głównego
● źródła metadanych
● głównego adresu API
wow such configurable
Hooki ($hooks)
● niczym Angular interceptors
● pozwalają:
○ modyfikować żądanie przed wysłaniem
○ zmieniać w locie odpowiedź
○ sterować parsowaniem odpowiedzi
○ globalnie reagować na błędy API
Duża ilość do wyboru
● before-create
● after-create
● after-create-error
● before-save
● after-save
● after-save-error
● before-update
● after-update
● after-update-error
● before-destroy
● after-destroy
● after-destroy-error
● before-request
● after-request
● after-request-error
● before-fetch
● before-fetch-many
● after-feed
● after-feed-error
● after-fetch-many
● after-fetch-many-error
● after-init
● after-remove
● before-render
Rozszerzenia ($extend)
● nadpisywanie metod Restmoda
● dodawanie nowych metod
○ do statycznego interfejsu
○ dla modeli
○ dla kolekcji
Sterowanie atrybutami
● wartości domyślne
● maskowanie atrybutów
● ustawienia (de)serializacji
● konfiguracja relacji
Może przykład?
Przykładowy scenariusz
● API udostępnia:
○ informacje o muzykach
○ informacje o płytach
● Dodatkowo można:
○ osobno pobrać historię zespołu
○ szukać artystów po nazwach
● API wymaga tokenu
Globalna konfiguracja
module.config(['restmodProvider',
function (restmodProvider) {
restmodProvider.rebase("MyAPIStyle");
restmodProvider.rebase({ ... })
}
]);
Api Style - globalna konfiguracja która
dostosowuje modele do stylu API
Piszemy API Style:
module.factory('MyAPIStyle', function (restmod) {
return restmod.mixin('DefaultPacker', {
$config: {
primaryKey: "id",
jsonMeta: "meta"
},
$extend: {...}, $hooks: {...}, ...
});
})
Ustawiamy token autoryzacyjny
module.config(['restmodProvider',
function (restmodProvider) {
restmodProvider.rebase({
$hooks: {
'before-request': function (request) {
request.headers["X-Token"] = TOKEN;
return request;
}
}
});
});
})
Rzut oka na /artists
{
artist: {
id: 1,
name: "Django Reinhardt",
image: "/img/reinhardt.png",
tags: [
{value: "guitar"},
{value: "jazz"}
]
},
meta: {...}
}
/img/reinhardt.png
GET: /artists/1
Tworzymy definicję modelu Artist
module.factory(‘ArtistModel’, function (restmod) {
restmod.model('/artists')
.mix({
$hooks: {...},
$extend: {...},
$config: {name: 'artist'},
// ...
});
});
Podstawy korzystania z modelu
var django = ModelArtist.$find(1);
// GET: /artists/1
django.$then(function(model){
console.log( model.image );
// > "/img/reinhardt.png"
});
Tworzymy nowy wpis w API...
var newBand = ModelArtist.$create({
name: "Flogging Molly"
});
// POST: /artists
… i potem go edytujemy
newBand.image = "/img/shamrock.jpg";
newBand.$save(); // PUT
newBand.$save(["image"]); // PATCH
Pobieramy kolekcję modeli...
var bands = ModelArtist.$collection();
bands.$fetch();
// GET: /artists
… lub tylko jej fragment
bands = ModelArtist.$search({
name: "Stevie"
}).$refresh();
// GET: /artists?name=Stevie
Dodajemy metodę do modelu...
module.factory("ArtistModel", function (restmod) {
restmod.model('/artists').mix({
$extend: {
Record: {
getImagePath: function(){
return API_PATH + this.image;
}
}
},
$config: {...}, $hooks: {...}, ...
});
});
… i korzystamy z niej
var image = newBand.getImagePath();
// https://localhost/api/img/shamrock.jpg
Oprócz interfejsu Record można także
rozszerzać intrfejsy List, Scope, Static i inne.
Konfigurujemy atrybuty
module.factory(‘ArtistModel’, function (restmod) {
restmod.model('/artists').mix({
image: { init: "/img/default.png" },
albums: { hasMany: "AlbumModel" },
history: { hasOne: "HistoryModel" },
tags: { hasMany: "TagModel" },
$hooks: {...}, $extend: {...}, $config: {...}
});
});
Wykorzystujemy relacje
var albums = django.albums.$fetch();
// GET: /artists/1/albums
var history = django.history.$fetch();
// GET: /artists/1/history
var tags = django.tags;
Zakładając, że zdefiniowaliśmy TagModel, HistoryModel, AlbumModel:
Podsumowanie - wady
● niedopowiedzenia i błędy w dokumentacji
● modele są zawsze związane z kolekcją
● brak wbudowanych metod hurtowych
● tylko jedno wbudowane API style
Podsumowanie - zalety
● sporo możliwości konfiguracyjnych
● wpływ na przebieg działania modułu
● możliwość używania z każdym REST API
● dobrze współpracuje z formularzami
● wsparcie dla relacji
Pytania?
marcin.gajda@tsh.io

More Related Content

PDF
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
PDF
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
PPT
Podstawy php
PPT
Podstawy php
PDF
Angular Restmod
PPTX
Prezentacja php3
PDF
Analizy Przestrzenne z wykorzystaniem GRASS vol.15
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Podstawy php
Podstawy php
Angular Restmod
Prezentacja php3
Analizy Przestrzenne z wykorzystaniem GRASS vol.15

What's hot (20)

PDF
Budowa elementów GUI za pomocą biblioteki React - szybki start
PDF
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing
PPTX
ASP.NET MVC - najważniejsze założenia
PDF
Podstawy AngularJS
PDF
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
PDF
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
PDF
Modularny JavaScript - meet.js
PDF
Kickoff to Node.js
PDF
Architektura ngrx w angular 2+
DOCX
Zajecia4 progbiz
PDF
TWIG - niezłe widoki dla PHP
PDF
Technologia Xamarin i wprowadzenie do Windows IoT core
PDF
Secure Coding w praktyce.
ZIP
JavaScript jako przykład obiektowego języka zorientowanego na prototypy
PDF
TypeScript as a runtime error terminator
PDF
NSOperation(Queue)
ODP
ZamCamp #6 - Najczęstsze błędy w PHP
PPTX
Java 8 jest tuż za rogiem
PDF
Objective C
PPT
„Need for speed, czyli jak wycisnąć siódme poty z bazy PostgreSQL” - Wojciech...
Budowa elementów GUI za pomocą biblioteki React - szybki start
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing
ASP.NET MVC - najważniejsze założenia
Podstawy AngularJS
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
Modularny JavaScript - meet.js
Kickoff to Node.js
Architektura ngrx w angular 2+
Zajecia4 progbiz
TWIG - niezłe widoki dla PHP
Technologia Xamarin i wprowadzenie do Windows IoT core
Secure Coding w praktyce.
JavaScript jako przykład obiektowego języka zorientowanego na prototypy
TypeScript as a runtime error terminator
NSOperation(Queue)
ZamCamp #6 - Najczęstsze błędy w PHP
Java 8 jest tuż za rogiem
Objective C
„Need for speed, czyli jak wycisnąć siódme poty z bazy PostgreSQL” - Wojciech...
Ad

Viewers also liked (20)

PPTX
AngülarJS – Czyli o czym warto pamiętać programując za Odrą
PDF
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
PDF
Angular 2.0 – Kochaj albo rzuć!
PDF
e2e frameworks - czyli kij ma dwa końce
PDF
Deploy appki na iOS, czyli magia publikacji
PDF
Confd - Uszanowanko Programowanko
PDF
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...
PDF
Deployment z Ansible
PDF
Gherkin - jak zostać poetą w IT
PDF
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
PDF
Pi razy drzwi - o szacowaniu projektów
PDF
O Electronie słów kilka
PDF
Gulp.js - alternatywa do Grunta
PDF
PDF
Bitcoin - (nie)udany eksperyment?
PDF
Wielkie protokoły wielkich ludzi
PDF
Tester - przyjaciel czy wróg programisty?
PDF
PSR-7 - HTTP message interfaces
AngülarJS – Czyli o czym warto pamiętać programując za Odrą
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Angular 2.0 – Kochaj albo rzuć!
e2e frameworks - czyli kij ma dwa końce
Deploy appki na iOS, czyli magia publikacji
Confd - Uszanowanko Programowanko
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...
Deployment z Ansible
Gherkin - jak zostać poetą w IT
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
Pi razy drzwi - o szacowaniu projektów
O Electronie słów kilka
Gulp.js - alternatywa do Grunta
Bitcoin - (nie)udany eksperyment?
Wielkie protokoły wielkich ludzi
Tester - przyjaciel czy wróg programisty?
PSR-7 - HTTP message interfaces
Ad

More from The Software House (20)

PDF
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
PDF
Uszanowanko Podsumowanko
PDF
Jak efektywnie podejść do certyfikacji w AWS?
PDF
O co chodzi z tą dostępnością cyfrową?
PDF
Chat tekstowy z użyciem Amazon Chime
PDF
Migracje danych serverless
PDF
Jak nie zwariować z architekturą Serverless?
PDF
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
PDF
Feature flags na ratunek projektu w JavaScript
PDF
Typowanie nominalne w TypeScript
PDF
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
PDF
Serverless Compose vs hurtownia danych
PDF
Testy API: połączenie z bazą danych czy implementacja w pamięci
PDF
Jak skutecznie read model. Case study
PDF
Firestore czyli ognista baza od giganta z Doliny Krzemowej
PDF
Jak utrzymać stado Lambd w ryzach
PDF
Jak poskromić AWS?
PDF
O łączeniu Storyblok i Next.js
PDF
Amazon Step Functions. Sposób na implementację procesów w chmurze
PDF
Od Figmy do gotowej aplikacji bez linijki kodu
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Uszanowanko Podsumowanko
Jak efektywnie podejść do certyfikacji w AWS?
O co chodzi z tą dostępnością cyfrową?
Chat tekstowy z użyciem Amazon Chime
Migracje danych serverless
Jak nie zwariować z architekturą Serverless?
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Feature flags na ratunek projektu w JavaScript
Typowanie nominalne w TypeScript
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Serverless Compose vs hurtownia danych
Testy API: połączenie z bazą danych czy implementacja w pamięci
Jak skutecznie read model. Case study
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Jak utrzymać stado Lambd w ryzach
Jak poskromić AWS?
O łączeniu Storyblok i Next.js
Amazon Step Functions. Sposób na implementację procesów w chmurze
Od Figmy do gotowej aplikacji bez linijki kodu

Angular restmod – wygodny sposób na komunikację z API

  • 1. Angular Restmod wygodny sposób na komunikację z API Marcin Gajda Front-End developer The Software house
  • 2. Angular Restmod? ● implementuje Active Record ● mapuje dane z REST API na modele ● pozwala korzystać z kolekcji modeli ● automatyzuje tworzenie relacji REST API – bezstanowy interfejs programistyczny oparty o model klient - serwer i protokół HTTP.
  • 3. Relacje? ● zależności między obiektami ● obsługa “1 do 1” oraz “1 do n” ● wsparcie dla modeli “inline” ● automatyczne rzutowanie na typ ● generowanie adresów API
  • 4. Konfiguracja Restmoda ● system wstawek ● wstawka może składać się z: ○ ogólnej konfiguracji ($config) ○ uchwytów zdarzeń ($hooks) ○ rozszerzeń ($extend) ○ ustawień dla atrybutów ● podział na: ○ konfiguracja globalna ○ konfiguracja “per definicja”
  • 5. Ogólne ustawienia ($config) Pozwala na ustawienie m.in: ● nazwy klucza głównego ● źródła metadanych ● głównego adresu API wow such configurable
  • 6. Hooki ($hooks) ● niczym Angular interceptors ● pozwalają: ○ modyfikować żądanie przed wysłaniem ○ zmieniać w locie odpowiedź ○ sterować parsowaniem odpowiedzi ○ globalnie reagować na błędy API
  • 7. Duża ilość do wyboru ● before-create ● after-create ● after-create-error ● before-save ● after-save ● after-save-error ● before-update ● after-update ● after-update-error ● before-destroy ● after-destroy ● after-destroy-error ● before-request ● after-request ● after-request-error ● before-fetch ● before-fetch-many ● after-feed ● after-feed-error ● after-fetch-many ● after-fetch-many-error ● after-init ● after-remove ● before-render
  • 8. Rozszerzenia ($extend) ● nadpisywanie metod Restmoda ● dodawanie nowych metod ○ do statycznego interfejsu ○ dla modeli ○ dla kolekcji
  • 9. Sterowanie atrybutami ● wartości domyślne ● maskowanie atrybutów ● ustawienia (de)serializacji ● konfiguracja relacji Może przykład?
  • 10. Przykładowy scenariusz ● API udostępnia: ○ informacje o muzykach ○ informacje o płytach ● Dodatkowo można: ○ osobno pobrać historię zespołu ○ szukać artystów po nazwach ● API wymaga tokenu
  • 11. Globalna konfiguracja module.config(['restmodProvider', function (restmodProvider) { restmodProvider.rebase("MyAPIStyle"); restmodProvider.rebase({ ... }) } ]); Api Style - globalna konfiguracja która dostosowuje modele do stylu API
  • 12. Piszemy API Style: module.factory('MyAPIStyle', function (restmod) { return restmod.mixin('DefaultPacker', { $config: { primaryKey: "id", jsonMeta: "meta" }, $extend: {...}, $hooks: {...}, ... }); })
  • 13. Ustawiamy token autoryzacyjny module.config(['restmodProvider', function (restmodProvider) { restmodProvider.rebase({ $hooks: { 'before-request': function (request) { request.headers["X-Token"] = TOKEN; return request; } } }); }); })
  • 14. Rzut oka na /artists { artist: { id: 1, name: "Django Reinhardt", image: "/img/reinhardt.png", tags: [ {value: "guitar"}, {value: "jazz"} ] }, meta: {...} } /img/reinhardt.png GET: /artists/1
  • 15. Tworzymy definicję modelu Artist module.factory(‘ArtistModel’, function (restmod) { restmod.model('/artists') .mix({ $hooks: {...}, $extend: {...}, $config: {name: 'artist'}, // ... }); });
  • 16. Podstawy korzystania z modelu var django = ModelArtist.$find(1); // GET: /artists/1 django.$then(function(model){ console.log( model.image ); // > "/img/reinhardt.png" });
  • 17. Tworzymy nowy wpis w API... var newBand = ModelArtist.$create({ name: "Flogging Molly" }); // POST: /artists
  • 18. … i potem go edytujemy newBand.image = "/img/shamrock.jpg"; newBand.$save(); // PUT newBand.$save(["image"]); // PATCH
  • 19. Pobieramy kolekcję modeli... var bands = ModelArtist.$collection(); bands.$fetch(); // GET: /artists
  • 20. … lub tylko jej fragment bands = ModelArtist.$search({ name: "Stevie" }).$refresh(); // GET: /artists?name=Stevie
  • 21. Dodajemy metodę do modelu... module.factory("ArtistModel", function (restmod) { restmod.model('/artists').mix({ $extend: { Record: { getImagePath: function(){ return API_PATH + this.image; } } }, $config: {...}, $hooks: {...}, ... }); });
  • 22. … i korzystamy z niej var image = newBand.getImagePath(); // https://localhost/api/img/shamrock.jpg Oprócz interfejsu Record można także rozszerzać intrfejsy List, Scope, Static i inne.
  • 23. Konfigurujemy atrybuty module.factory(‘ArtistModel’, function (restmod) { restmod.model('/artists').mix({ image: { init: "/img/default.png" }, albums: { hasMany: "AlbumModel" }, history: { hasOne: "HistoryModel" }, tags: { hasMany: "TagModel" }, $hooks: {...}, $extend: {...}, $config: {...} }); });
  • 24. Wykorzystujemy relacje var albums = django.albums.$fetch(); // GET: /artists/1/albums var history = django.history.$fetch(); // GET: /artists/1/history var tags = django.tags; Zakładając, że zdefiniowaliśmy TagModel, HistoryModel, AlbumModel:
  • 25. Podsumowanie - wady ● niedopowiedzenia i błędy w dokumentacji ● modele są zawsze związane z kolekcją ● brak wbudowanych metod hurtowych ● tylko jedno wbudowane API style
  • 26. Podsumowanie - zalety ● sporo możliwości konfiguracyjnych ● wpływ na przebieg działania modułu ● możliwość używania z każdym REST API ● dobrze współpracuje z formularzami ● wsparcie dla relacji