SlideShare a Scribd company logo
AngularJS Server Communication
Intro
● AngularJS web apps sono interamente client-side
applications!
● Senza un back end saremmo limitati a mostrare e
utilizzare solo le info presenti a load time.
● Angularjs fornisce servizi per la comunicazione con il
server:
o $http;
o $resource;
● Ci sono inoltre servizi di terze parti:
o restangular
$http
$http è un servizio che facilita la comunicazione con il
server via
● XMLHttpRequest;
● JSONP.
E’ un wrapper del XMLHttpRequest object.
$http
// Simple GET request example
$http({
method: 'GET',
url: '/api/users'
})
.success(function(data, status, headers, config)
{
// this callback will be called
asynchronously when the response is available
})
.error(function(data, status, headers, config) {
// called asynchronously if an error
occurs or server returns response with an error
status
});
// Simple GET request example
$http({
method: 'GET',
url: '/api/users'
})
.then(function(resp) {
// resp is response object
}, function(resp){
// resp with error
});
$http - Shortcut Methods
● get
o $http.get('/someUrl', config)
● post
o $http.post('/someUrl', someObject, config)
● delete
o $http.delete('/someUrl', config)
● ...
$http - Config
● {params: {param1:value, .., paramN:value}}
● {cache: boolean}
● …..
// Simple GET request example
$http.get('/api/getUser’, {params: {id: $idUtente}})
.success(function(data, status, headers, config) {
})
.error(function(data, status, headers, config) {
});
$http - Cache
Di default il servizio $http non usa la cache.
E’ possibile impostare la cache per
● request
o $http.get('/api/getUser’, {cache: true})
● per applicazione
o .config(function($httpProvider, $cacheFactory) {
$httpProvider.defaults.cache = true
}
Default cache: $cacheFactory
$http - Custom Cache
// Custom cache request example
var lru = $cacheFactory('lru', {
capacity: 20
});
// $http request
$http.get('/api/users', { cache: lru })
.success(function(data) {})
.error(function(data) {});
// Custom cache config example
angular.module('myApp')
.config(function($httpProvider, $cacheFactory) {
$httpProvider.defaults.cache =
$cacheFactory('lru', {
capacity: 20
});
});
Web App sempre più RESTful
● L’approccio REST è venuto alla ribalta negli ultimi anni
ed è attualmente molto usato
● RESTful VS. SOAP - REST propone una visione del
Web incentrata sul concetto di risorsa mentre i SOAP
Web Service mettono in risalto il concetto di servizio.
● Angularjs propone il servizio $resource
RESTful
● Apparso la prima volta nel 2000 nella tesi di Roy
Fielding
● Definisce una serie di principi:
o Identificazione delle risorse
o Utilizzo esplicito dei metodi HTTP
o Risorse autodescrittive
o Collegamenti tra risorse
o Comunicazione senza stato
● Il WWW è un esempio concreto di questi principi
Servizi RESTful
● In una architettura REST è definita una mappatura uno ad uno tra
le tipiche operazioni CRUD e i metodi http
o POST - Create
o GET - Read
o PUT - Update
o DELETE - Delete
● Un oggetto è identificabile univocamente attraverso una URI
● Nessun vincolo sulle modalità di rappresentazione di una risorsa
● Diversi formati di rappresentazione: XML, JSON, HTML, … .
$resource
$resource è una factory che incapsula i servizi $http e
aggiunge supporto per l’interazione con i servizi RESTful
server-side
Richiede
● L’importazione della lib angular-resource.js
● La definizione della dipendenza dal modulo ngResource
o angular.module('myApp', ['ngResource']);
$resource
Sintassi
$resource(url, [paramDefaults], [actions], options);
Dove:
● url può essere parametrizzato mediante il simbolo : Es:
https://api.mongolab.com/api/1/databases/angworkshop/collections/contat
to/:id
● actions è un hash che permette di indicare comportamenti custom che estendono le action di
default di resource.
{action1: {method:?, params:?, isArray:?, headers:?, ...},
action2: {method:?, params:?, isArray:?, headers:?, ...},
...}
$resource - [actions]
● action – {string} – Nome dell’azione
● method – {string} – Case insensitive HTTP method (e.g. GET, POST, PUT, DELETE, JSONP,
etc).
● params – {Object} – Set opzionale di parametri..
● isArray – {boolean} – True se il result è un array
● ...
{action1: {method:?, params:?, isArray:?, headers:?, ...},
action2: {method:?, params:?, isArray:?, headers:?, ...},
...}
$resource - EXAMPLE
// Definizione
contattoModel.factory('Contatto', ['$resource',
function($resource){
return
$resource('https://api.mongolab.com/api/1/databases/angworkshop/collections/contatto/:id', {},
{
// actions
show: { method: 'GET', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj', id: '@id'} },
update: { method: 'PUT', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj', id: '@id'} },
delete: { method: 'DELETE', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj', id: '@id'} },
create: { method: 'POST', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj'} }
});
}]);
$resource - EXAMPLE
// Uso
Contatto.create($scope.contatto,
function(response){
// success
console.log('Successo', response);
$scope.showSuccess = true;
},function(response){
// error
console.log('Error', response);
$scope.showDanger = true;
});
// Uso con $promise
Contatto.create($scope.contatto)
.$promise
.then(function(response) {
// success
console.log('Successo', response);
$scope.showSuccess = true;
})
.then(function(response) {
// error
tconsole.log('Error', response);
$scope.showDanger = true
});
$resource - Cache
Analoga alla cache $http. Può assumere i valori:
● false/true - $cacheFactory
● custom cache
Restangular
Libreria esterna.
Si propone di rendere ancora più semplice la
comunicazione con il mondo esterno.
Richiede
● L’importazione della lib restangular.js
● La definizione della dipendenza dal modulo restangular
o angular.module('myApp', ['restangular']);
Perché Restangular
The idea is that Restangular can also handle all of your URLs, so that you don't have to know anything about them.
Suppose that you have something like this for cars : /users/123/cars/456
In $resource, You'd have to construct that URL manually and you'd also have to construct the $resource object for this manually.
Restangular helps you in this by "remembering" the URLs.
So if you do in some place
Restangular.one("users", 123).get()
.then(function(user) {
$scope.user = user;
});
// Some other code //Automatically does the request to
/users/123/cars as it remembers in which object you're asking it.
$scope.user.getList('cars')
Martin Gontovnikas www.stackoverflow.com
Approfondimenti: promise
Contesto:
● chiamate asincrona
Alternative
● callback
Approfondimenti: promise
// Callback example
asyncCall(function(err, data1){
if(err) return callback(err);
anotherAsyncCall(function(err2, data2){
if(err2) return calllback(err2);
oneMoreAsyncCall(function(err3, data3){
if(err3) return callback(err3);
// and so on
});
});
});
Problemi callback:
● una scarsa leggibilità del
codice
● difficoltà di composizione delle
callback
● difficoltà di gestione degli errori
e di debug
Approfondimenti: promise
Sono oggetti che rappresentano il risultato di una chiamata di funzione
asincrona.
Stato:
● pending è lo stato in cui non è stato ancora ottenuto il risultato della
chiamata asincrona
● resolved in questo stato la chiamata asincrona ha prodotto un risultato
Approfondimenti: promise
// promise example
asyncCall()
.then(function(data1){
// do something...
return anotherAsyncCall();
})
.then(function(data2){
// do something...
return oneMoreAsyncCall();
}).fail(function(err) {
// handle any error resulting from any of the above
calls
})
.done();
Non nativamente supportate da
javascript
Bisogna utilizzare la libreria “Q”
Vantaggi:
● codice più leggibile
Approfondimenti: XMLHttpRequest
● Insieme di API Javascript disegnato da Microsoft e
adottato da Google, Apple e Mozilla
● Consentono di scambiare dati con il server senza dover
ricaricare l’intera pagina
● A discapito del nome può essere usato per recuperare
diversi formati di file (es. JSON)
Approfondimenti: JSON
Acronimo di JavaScript Object Notation, è un formato
adatto all'interscambio di dati fra applicazioni client-server
// JSON example
{name1: value, name2: [{nameAr1: value}, {nameAr2:value}]}
Approfondimenti: JSONP
Same-domain-policy impedisce a script scaricati dalla rete di
accedere, tramite qualsiasi tipo di richiesta HTTP, a risorse che
si trovano su server diversi rispetto a quello iniziale che ha
inviato lo script.
JSONP Acronimo di JavaScript Object Notation with Padding è
una tecnica che permette di ovviare a questa limitazione
permettendo a un browser di accedere, ovviamente con alcuni
limiti, a risorse remote indipendentemente dall’host di origine.
Approfondimenti: Service, Factory e Provider
● I tre servizi sono in realtà un unico servizio: provider
● factory e service sono implementazioni differenti di
provider
● vengono registrati come singleton all'interno
dell'applicazione AngularJS
Service
Dal punto di vista sintattico un Services restituisce un oggetto singleton che rimane in vita fino alla
chiusura del browser.
Sintassi:
mymodule.service('serviceName', function([d1,...,dn]))
dove
● function([d1,..,dn]) è il costruttore della funzione che verrà istanziata;
● e [d1,...,dn] è un array di 0 o più dipendenze.
.
Service - Example
La più semplice implementazione di provider, rappresenta l'istanza di una funzione creata usando
l'operatore new
angular.module(‘app', [])
.service(‘myService’, function(a){
...
}]);
Angular lo inizializza così: var myServiceSingleton = new myService();
Factory
Una Factory è una funzione responsabile della creazione di un nuovo Servizio.
La sintassi per definire una Factory è la seguente
mymodule.factory(“serviceID”, function([d1,...,dn]))
dove
● function([d1,...,dn]) è la funzione che angular richiamerà per creare una nuova istanza
del servizio;
● e [d1,...,dn] è un array di 0 o più dipendenze.
Un classico esempio d’uso di una Factory è per creare un nuovo servizio
che dipende da $resource.
Factory - Example
angular.module('app',[])
.factory('myFactory', ['d1', function(d1){
return Service()
}]);
Angular lo inizializza così: var myFactorySingleton = myFactory();
Provider
Il provider è definito come un tipo custom configurabile in fase di configurazione che implementa il
metodo $get. Questo metodo altro non è che una funzione Factory.
La sintassi per definire un provider è la seguente:
mymodule.provider(“providerName”, function([d1,...,dn]))
dove
● f([d1,...,dn]) è una funzione che crea una nuova istanza di un servizio;
● e [d1,...,dn] è un array di 0 o più dipendenze.
Nel pratico una funzione Provider è utile per isolare il Service creato dal resto dell’applicazione e
consentire l’intercambiabilità di Service che implementano la stessa interfaccia o il comportamento
dello stesso in modo configurabile e trasparente per il resto dell’applicazione.
Provider - Example
angular.module('app',[]).provider('myProvider', function() {
var PREFIX = 'https://api.mongolab.com/api/angworkshop/collections/';
// API accessibili in fase di configurazione
this.setPrefix = function setPrefix(value) {
PREFIX = value;
};
this.$get = function myProviderFactory() {
return return {
say = function say(msg) {
return PREFIX + msg;
}
};
};});
Angular lo inizializza così var myProviderSingleton = myProvider();

More Related Content

What's hot

ModulAngular
ModulAngularModulAngular
ModulAngular
extrategy
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webLuca Milan
 
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
Codemotion
 
Require js
Require jsRequire js
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client
Sabino Labarile
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campusDotNetCampus
 
Corso angular js componenti
Corso angular js componentiCorso angular js componenti
Corso angular js componenti
Beniamino Ferrari
 
JavaScript
JavaScriptJavaScript
JavaScript
Manuel Scapolan
 
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
Andrea Saltarello
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
orestJump
 
Applicazioni Web ultra-performanti con Vue.js e Delphi
Applicazioni Web ultra-performanti con Vue.js e DelphiApplicazioni Web ultra-performanti con Vue.js e Delphi
Applicazioni Web ultra-performanti con Vue.js e Delphi
Marco Breveglieri
 
Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010
Fabrizio Bernabei
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1massimiliano.wosz
 
Yagwto
YagwtoYagwto
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, PiacenzaSviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Marco Breveglieri
 
Umarells
UmarellsUmarells
Umarells
Guido Bellomo
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Rails
jekil
 
ReactJS for beginners
ReactJS for beginnersReactJS for beginners
ReactJS for beginners
Ilaria Franchini
 
Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0
firenze-gtug
 

What's hot (20)

ModulAngular
ModulAngularModulAngular
ModulAngular
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
 
Workshop angular
Workshop angularWorkshop angular
Workshop angular
 
Require js
Require jsRequire js
Require js
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campus
 
Corso angular js componenti
Corso angular js componentiCorso angular js componenti
Corso angular js componenti
 
JavaScript
JavaScriptJavaScript
JavaScript
 
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Applicazioni Web ultra-performanti con Vue.js e Delphi
Applicazioni Web ultra-performanti con Vue.js e DelphiApplicazioni Web ultra-performanti con Vue.js e Delphi
Applicazioni Web ultra-performanti con Vue.js e Delphi
 
Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1
 
Yagwto
YagwtoYagwto
Yagwto
 
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, PiacenzaSviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
 
Umarells
UmarellsUmarells
Umarells
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Rails
 
ReactJS for beginners
ReactJS for beginnersReactJS for beginners
ReactJS for beginners
 
Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0
 

Similar to AngularJS: server communication

Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
Luciano Colosio
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
Michele Capra
 
Javascript
JavascriptJavascript
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxProgettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Giovanni Cappellini
 
Net core base
Net core baseNet core base
Net core base
Beniamino Ferrari
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
Matteo Magni
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
Franco Lombardo
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai framework
Francesca1980
 
Linuxday2013
Linuxday2013 Linuxday2013
Linuxday2013
Mariano Fiorentino
 
Html5 e PHP
Html5 e PHPHtml5 e PHP
Html5 e PHP
Mariano Fiorentino
 
RESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachineRESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachine
Giancarlo Valente
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
lordarthas
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
Giampiero Granatella
 
Portlet JSR168/286
Portlet JSR168/286Portlet JSR168/286
Portlet JSR168/286
Alessio Dimauro
 
Laravel 7 REST API
Laravel 7 REST APILaravel 7 REST API
Laravel 7 REST API
Beniamino Ferrari
 
Hexagonal architecture ita
Hexagonal architecture itaHexagonal architecture ita
Hexagonal architecture ita
Alessandro Minoccheri
 
6.01 php ajax_json_mysql
6.01 php ajax_json_mysql6.01 php ajax_json_mysql
6.01 php ajax_json_mysql
High Secondary School
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
Federico Paparoni
 
Ajax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni webAjax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni web
Dominopoint - Italian Lotus User Group
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
Stefano Dindo
 

Similar to AngularJS: server communication (20)

Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Javascript
JavascriptJavascript
Javascript
 
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxProgettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
 
Net core base
Net core baseNet core base
Net core base
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai framework
 
Linuxday2013
Linuxday2013 Linuxday2013
Linuxday2013
 
Html5 e PHP
Html5 e PHPHtml5 e PHP
Html5 e PHP
 
RESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachineRESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachine
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
 
Portlet JSR168/286
Portlet JSR168/286Portlet JSR168/286
Portlet JSR168/286
 
Laravel 7 REST API
Laravel 7 REST APILaravel 7 REST API
Laravel 7 REST API
 
Hexagonal architecture ita
Hexagonal architecture itaHexagonal architecture ita
Hexagonal architecture ita
 
6.01 php ajax_json_mysql
6.01 php ajax_json_mysql6.01 php ajax_json_mysql
6.01 php ajax_json_mysql
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
Ajax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni webAjax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni web
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
 

AngularJS: server communication

  • 2. Intro ● AngularJS web apps sono interamente client-side applications! ● Senza un back end saremmo limitati a mostrare e utilizzare solo le info presenti a load time. ● Angularjs fornisce servizi per la comunicazione con il server: o $http; o $resource; ● Ci sono inoltre servizi di terze parti: o restangular
  • 3. $http $http è un servizio che facilita la comunicazione con il server via ● XMLHttpRequest; ● JSONP. E’ un wrapper del XMLHttpRequest object.
  • 4. $http // Simple GET request example $http({ method: 'GET', url: '/api/users' }) .success(function(data, status, headers, config) { // this callback will be called asynchronously when the response is available }) .error(function(data, status, headers, config) { // called asynchronously if an error occurs or server returns response with an error status }); // Simple GET request example $http({ method: 'GET', url: '/api/users' }) .then(function(resp) { // resp is response object }, function(resp){ // resp with error });
  • 5. $http - Shortcut Methods ● get o $http.get('/someUrl', config) ● post o $http.post('/someUrl', someObject, config) ● delete o $http.delete('/someUrl', config) ● ...
  • 6. $http - Config ● {params: {param1:value, .., paramN:value}} ● {cache: boolean} ● ….. // Simple GET request example $http.get('/api/getUser’, {params: {id: $idUtente}}) .success(function(data, status, headers, config) { }) .error(function(data, status, headers, config) { });
  • 7. $http - Cache Di default il servizio $http non usa la cache. E’ possibile impostare la cache per ● request o $http.get('/api/getUser’, {cache: true}) ● per applicazione o .config(function($httpProvider, $cacheFactory) { $httpProvider.defaults.cache = true } Default cache: $cacheFactory
  • 8. $http - Custom Cache // Custom cache request example var lru = $cacheFactory('lru', { capacity: 20 }); // $http request $http.get('/api/users', { cache: lru }) .success(function(data) {}) .error(function(data) {}); // Custom cache config example angular.module('myApp') .config(function($httpProvider, $cacheFactory) { $httpProvider.defaults.cache = $cacheFactory('lru', { capacity: 20 }); });
  • 9. Web App sempre più RESTful ● L’approccio REST è venuto alla ribalta negli ultimi anni ed è attualmente molto usato ● RESTful VS. SOAP - REST propone una visione del Web incentrata sul concetto di risorsa mentre i SOAP Web Service mettono in risalto il concetto di servizio. ● Angularjs propone il servizio $resource
  • 10. RESTful ● Apparso la prima volta nel 2000 nella tesi di Roy Fielding ● Definisce una serie di principi: o Identificazione delle risorse o Utilizzo esplicito dei metodi HTTP o Risorse autodescrittive o Collegamenti tra risorse o Comunicazione senza stato ● Il WWW è un esempio concreto di questi principi
  • 11. Servizi RESTful ● In una architettura REST è definita una mappatura uno ad uno tra le tipiche operazioni CRUD e i metodi http o POST - Create o GET - Read o PUT - Update o DELETE - Delete ● Un oggetto è identificabile univocamente attraverso una URI ● Nessun vincolo sulle modalità di rappresentazione di una risorsa ● Diversi formati di rappresentazione: XML, JSON, HTML, … .
  • 12. $resource $resource è una factory che incapsula i servizi $http e aggiunge supporto per l’interazione con i servizi RESTful server-side Richiede ● L’importazione della lib angular-resource.js ● La definizione della dipendenza dal modulo ngResource o angular.module('myApp', ['ngResource']);
  • 13. $resource Sintassi $resource(url, [paramDefaults], [actions], options); Dove: ● url può essere parametrizzato mediante il simbolo : Es: https://api.mongolab.com/api/1/databases/angworkshop/collections/contat to/:id ● actions è un hash che permette di indicare comportamenti custom che estendono le action di default di resource. {action1: {method:?, params:?, isArray:?, headers:?, ...}, action2: {method:?, params:?, isArray:?, headers:?, ...}, ...}
  • 14. $resource - [actions] ● action – {string} – Nome dell’azione ● method – {string} – Case insensitive HTTP method (e.g. GET, POST, PUT, DELETE, JSONP, etc). ● params – {Object} – Set opzionale di parametri.. ● isArray – {boolean} – True se il result è un array ● ... {action1: {method:?, params:?, isArray:?, headers:?, ...}, action2: {method:?, params:?, isArray:?, headers:?, ...}, ...}
  • 15. $resource - EXAMPLE // Definizione contattoModel.factory('Contatto', ['$resource', function($resource){ return $resource('https://api.mongolab.com/api/1/databases/angworkshop/collections/contatto/:id', {}, { // actions show: { method: 'GET', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj', id: '@id'} }, update: { method: 'PUT', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj', id: '@id'} }, delete: { method: 'DELETE', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj', id: '@id'} }, create: { method: 'POST', params: {apiKey:'WLKPfaC3ztzHpxYtyTD85D7-7iXaO4dj'} } }); }]);
  • 16. $resource - EXAMPLE // Uso Contatto.create($scope.contatto, function(response){ // success console.log('Successo', response); $scope.showSuccess = true; },function(response){ // error console.log('Error', response); $scope.showDanger = true; }); // Uso con $promise Contatto.create($scope.contatto) .$promise .then(function(response) { // success console.log('Successo', response); $scope.showSuccess = true; }) .then(function(response) { // error tconsole.log('Error', response); $scope.showDanger = true });
  • 17. $resource - Cache Analoga alla cache $http. Può assumere i valori: ● false/true - $cacheFactory ● custom cache
  • 18. Restangular Libreria esterna. Si propone di rendere ancora più semplice la comunicazione con il mondo esterno. Richiede ● L’importazione della lib restangular.js ● La definizione della dipendenza dal modulo restangular o angular.module('myApp', ['restangular']);
  • 19. Perché Restangular The idea is that Restangular can also handle all of your URLs, so that you don't have to know anything about them. Suppose that you have something like this for cars : /users/123/cars/456 In $resource, You'd have to construct that URL manually and you'd also have to construct the $resource object for this manually. Restangular helps you in this by "remembering" the URLs. So if you do in some place Restangular.one("users", 123).get() .then(function(user) { $scope.user = user; }); // Some other code //Automatically does the request to /users/123/cars as it remembers in which object you're asking it. $scope.user.getList('cars') Martin Gontovnikas www.stackoverflow.com
  • 20. Approfondimenti: promise Contesto: ● chiamate asincrona Alternative ● callback
  • 21. Approfondimenti: promise // Callback example asyncCall(function(err, data1){ if(err) return callback(err); anotherAsyncCall(function(err2, data2){ if(err2) return calllback(err2); oneMoreAsyncCall(function(err3, data3){ if(err3) return callback(err3); // and so on }); }); }); Problemi callback: ● una scarsa leggibilità del codice ● difficoltà di composizione delle callback ● difficoltà di gestione degli errori e di debug
  • 22. Approfondimenti: promise Sono oggetti che rappresentano il risultato di una chiamata di funzione asincrona. Stato: ● pending è lo stato in cui non è stato ancora ottenuto il risultato della chiamata asincrona ● resolved in questo stato la chiamata asincrona ha prodotto un risultato
  • 23. Approfondimenti: promise // promise example asyncCall() .then(function(data1){ // do something... return anotherAsyncCall(); }) .then(function(data2){ // do something... return oneMoreAsyncCall(); }).fail(function(err) { // handle any error resulting from any of the above calls }) .done(); Non nativamente supportate da javascript Bisogna utilizzare la libreria “Q” Vantaggi: ● codice più leggibile
  • 24. Approfondimenti: XMLHttpRequest ● Insieme di API Javascript disegnato da Microsoft e adottato da Google, Apple e Mozilla ● Consentono di scambiare dati con il server senza dover ricaricare l’intera pagina ● A discapito del nome può essere usato per recuperare diversi formati di file (es. JSON)
  • 25. Approfondimenti: JSON Acronimo di JavaScript Object Notation, è un formato adatto all'interscambio di dati fra applicazioni client-server // JSON example {name1: value, name2: [{nameAr1: value}, {nameAr2:value}]}
  • 26. Approfondimenti: JSONP Same-domain-policy impedisce a script scaricati dalla rete di accedere, tramite qualsiasi tipo di richiesta HTTP, a risorse che si trovano su server diversi rispetto a quello iniziale che ha inviato lo script. JSONP Acronimo di JavaScript Object Notation with Padding è una tecnica che permette di ovviare a questa limitazione permettendo a un browser di accedere, ovviamente con alcuni limiti, a risorse remote indipendentemente dall’host di origine.
  • 27. Approfondimenti: Service, Factory e Provider ● I tre servizi sono in realtà un unico servizio: provider ● factory e service sono implementazioni differenti di provider ● vengono registrati come singleton all'interno dell'applicazione AngularJS
  • 28. Service Dal punto di vista sintattico un Services restituisce un oggetto singleton che rimane in vita fino alla chiusura del browser. Sintassi: mymodule.service('serviceName', function([d1,...,dn])) dove ● function([d1,..,dn]) è il costruttore della funzione che verrà istanziata; ● e [d1,...,dn] è un array di 0 o più dipendenze. .
  • 29. Service - Example La più semplice implementazione di provider, rappresenta l'istanza di una funzione creata usando l'operatore new angular.module(‘app', []) .service(‘myService’, function(a){ ... }]); Angular lo inizializza così: var myServiceSingleton = new myService();
  • 30. Factory Una Factory è una funzione responsabile della creazione di un nuovo Servizio. La sintassi per definire una Factory è la seguente mymodule.factory(“serviceID”, function([d1,...,dn])) dove ● function([d1,...,dn]) è la funzione che angular richiamerà per creare una nuova istanza del servizio; ● e [d1,...,dn] è un array di 0 o più dipendenze. Un classico esempio d’uso di una Factory è per creare un nuovo servizio che dipende da $resource.
  • 31. Factory - Example angular.module('app',[]) .factory('myFactory', ['d1', function(d1){ return Service() }]); Angular lo inizializza così: var myFactorySingleton = myFactory();
  • 32. Provider Il provider è definito come un tipo custom configurabile in fase di configurazione che implementa il metodo $get. Questo metodo altro non è che una funzione Factory. La sintassi per definire un provider è la seguente: mymodule.provider(“providerName”, function([d1,...,dn])) dove ● f([d1,...,dn]) è una funzione che crea una nuova istanza di un servizio; ● e [d1,...,dn] è un array di 0 o più dipendenze. Nel pratico una funzione Provider è utile per isolare il Service creato dal resto dell’applicazione e consentire l’intercambiabilità di Service che implementano la stessa interfaccia o il comportamento dello stesso in modo configurabile e trasparente per il resto dell’applicazione.
  • 33. Provider - Example angular.module('app',[]).provider('myProvider', function() { var PREFIX = 'https://api.mongolab.com/api/angworkshop/collections/'; // API accessibili in fase di configurazione this.setPrefix = function setPrefix(value) { PREFIX = value; }; this.$get = function myProviderFactory() { return return { say = function say(msg) { return PREFIX + msg; } }; };}); Angular lo inizializza così var myProviderSingleton = myProvider();

Editor's Notes

  1. La sintassi è la seguente La funzione ritorna una promise che ha due helper methods: success and error - o then
  2. Tutti ritornano una promise e accettano dei parametri opzionali
  3. Angular fa fronte a questa “esigenza” con $resource
  4. NOTA: questo non vuol dire che con il service $http non è possibile interagire con servizi REST Basta pensare che il core di $resource è $http Tuttavia $resource ne facilita l’uso essendo stato creato ad hoc
  5. uno script scaricato dal dominio google.com potrà accedere solamente a file che rispondano a URL che inizino con google.com.