SlideShare a Scribd company logo
1 of 27
Download to read offline
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

What's hot

Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startSages
 
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event SourcingNie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event SourcingThe Software House
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaBartlomiej Zass
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Codesushi.co (CODESUSHI LLC)
 
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...Infoshare
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.jsPatryk Jar
 
Architektura ngrx w angular 2+
Architektura ngrx w angular 2+Architektura ngrx w angular 2+
Architektura ngrx w angular 2+Paweł Żurowski
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPPiotr Gabryjeluk
 
Technologia Xamarin i wprowadzenie do Windows IoT core
Technologia Xamarin i wprowadzenie do Windows IoT coreTechnologia Xamarin i wprowadzenie do Windows IoT core
Technologia Xamarin i wprowadzenie do Windows IoT coreSages
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.Semihalf
 
JavaScript jako przykład obiektowego języka zorientowanego na prototypy
JavaScript jako przykład obiektowego języka zorientowanego na prototypyJavaScript jako przykład obiektowego języka zorientowanego na prototypy
JavaScript jako przykład obiektowego języka zorientowanego na prototypyRafal Piekarski
 
TypeScript as a runtime error terminator
TypeScript as a runtime error terminatorTypeScript as a runtime error terminator
TypeScript as a runtime error terminatorThe Software House
 
ZamCamp #6 - Najczęstsze błędy w PHP
ZamCamp #6 - Najczęstsze błędy w PHPZamCamp #6 - Najczęstsze błędy w PHP
ZamCamp #6 - Najczęstsze błędy w PHPzamcamp
 
Objective C
Objective CObjective C
Objective Ckonryd
 
„Need for speed, czyli jak wycisnąć siódme poty z bazy PostgreSQL” - Wojciech...
„Need for speed, czyli jak wycisnąć siódme poty z bazy PostgreSQL” - Wojciech...„Need for speed, czyli jak wycisnąć siódme poty z bazy PostgreSQL” - Wojciech...
„Need for speed, czyli jak wycisnąć siódme poty z bazy PostgreSQL” - Wojciech...krakspot
 

What's hot (20)

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

Viewers also liked

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

Viewers also liked (20)

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

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

Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaMaciej Ziarko
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Lexical scope, function vs. block scope, hoisting, scope closures
Lexical scope, function vs. block scope, hoisting, scope closuresLexical scope, function vs. block scope, hoisting, scope closures
Lexical scope, function vs. block scope, hoisting, scope closuresBrainhub
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykładynasza-klasa
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaWojciech Lichota
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in RailsSebastian Sito
 
Budowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOASBudowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOASMateusz Stępniak
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptJacek Okrojek
 
Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]Andrzej Krzywda
 
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...Tomasz Kopacz
 
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawyApptension
 
GraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem ApolloGraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem ApolloBoldare
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?The Software House
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
REST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoREST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoTomasz Dziuda
 

Similar to Angular restmod – wygodny sposób na komunikację z API (20)

Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Mongodb with Rails
Mongodb with RailsMongodb with Rails
Mongodb with Rails
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Lexical scope, function vs. block scope, hoisting, scope closures
Lexical scope, function vs. block scope, hoisting, scope closuresLexical scope, function vs. block scope, hoisting, scope closures
Lexical scope, function vs. block scope, hoisting, scope closures
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykłady
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in Rails
 
Budowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOASBudowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOAS
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]
 
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
 
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
 
GraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem ApolloGraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem Apollo
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
REST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoREST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp Trójmiasto
 
Torquebox
TorqueboxTorquebox
Torquebox
 

More from The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeThe Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSThe Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 
Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?The Software House
 

More from The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 
Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?
 

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