46
Web Api – The HTTP Way [email protected]

Web Api – The HTTP Way

Embed Size (px)

Citation preview

Page 1: Web Api – The HTTP Way

Web Api – The HTTP Way

[email protected]

Page 2: Web Api – The HTTP Way

Intro REST Style Pipeline Configuration Host Routing Controllers / Action Action Filters Message Handlers Content Negotation Dependency Injection Roadmap:

http://aspnetwebstack.codeplex.com/wikipage?title=Roadmap

Agenda

Page 3: Web Api – The HTTP Way

I pilastri per lo sviluppo Web

Page 4: Web Api – The HTTP Way

Framework per lo Sviluppo ed il Consumo di servizi HTTP (RestFul e non solo...);

Creata seguendo principi di programmazione AGILI e SOLIDI => Ortogonalità, Estensibilità;

Trasforma il protocollo l'HTTP in una piattaforma di programmazione.

E’ una api Simmetrica (parte Server / Client) E’ Open Source

http://aspnetwebstack.codeplex.com

Cos’è ?

Page 5: Web Api – The HTTP Way

Riutilizza meccanismi tipici di ASP.NET MVC quali: Routing, Model Binder e Filtri (Pre e Post esecuzione)

Pensata con un approccio FRICTION-LESS (Zero-Configuration, Registry Pattern)

Sfrutta il paradigma Convention Over Configuration (Auto selezione di Formatters / Http Headers e Mapping delle Action / Http Verbs)

Ricca di punti di estensibilità (Controller Activator, Message Handler, Filters, Tracing, Logging)

Realmente Asyncrona (nessuna scusa!)

I vantaggi

Page 6: Web Api – The HTTP Way

Nel modello ad oggetti di webapi esistono 3 astrazioni fondamentali che la rendono fruibile lato server e lato client (Api Simmetrica):

HttpRequestMessage HttpResponseMessage HttpMessageHandler

Catena di Trasformazione della Richiesta (bidirezionale, asincrona)

Good Design: astrazioni

HANDLER …

HANDLER 2

HANDLER 1

Richiesta Risposta

Page 7: Web Api – The HTTP Way

E' uno stile architetturale (SOAP invece è un protocollo basato su XML)

E’ stato discusso nel 2000 da Roy Fielding Buon Livello di Maturità

REpresentational State Transfer

Page 8: Web Api – The HTTP Way

REST: HTTP != RPC

Page 9: Web Api – The HTTP Way

Prima di Web Api nel mondo .NET non erano molte le alternative per sviluppare servizi REST:◦Open.RASTA◦ Service.Stack◦ASP.NET MVC◦WCF RestToolkit

Usare WCF per approcciare REST è possibile ma macchinoso (es. configurazione complessa) e poco flessibile (assenza di un meccanismo di ROUTING per le URL);

REST con il framework .NET

Page 10: Web Api – The HTTP Way

WebApi «Building Blocks»CONTROLLER

PIPELINE (HANDLERS)

HOST

Page 11: Web Api – The HTTP Way

WebApi può essere ospitata in 3 modi differenti:1. Self Hosting (bastato su WCF ottima per Console

Application o Windows Service)2. WebHosting (basato su ASP.NET / IIS)3. OWIN( basato su progetto Katana)

Tutte le soluzioni hanno in comune la classe HttpConfiguration che ha il compito di configurare il framework in ogni suo aspetto;

Blocco Host

Page 12: Web Api – The HTTP Way

Sono possibili vari livelli di configurazione su cui agire:

Livello Globale1. Con ASP.NET Web Hosting

Assembly System.Web.Http.WebHost

2. Con Self-Hosting Assembly System.Web.Http.SelfHost

Livello dei Servizi Livello Controller (per controller)

Configurazione Flessibile

Page 13: Web Api – The HTTP Way

L’oggetto deputato alla configurazione è un singleton: GlobalConfiguration.Configuration e contiene la sola istanza possibile della classe HttpConfiguration.

Configurazione: ASP.NET Hosting

Page 14: Web Api – The HTTP Way

Configurazione: ASP.NET Hosting

Page 15: Web Api – The HTTP Way

Configurazione Self HostingI settaggi sono contenuti nella classe HttpSelfHostConfiguration che deriva da HttpConfiguration.

Page 16: Web Api – The HTTP Way

DEMO SELF HOSTEDCome hostare una webapi all’interno di una console application e vivere felici

Page 17: Web Api – The HTTP Way

Implementato tramite un Registry Pattern, contiene tutti i «TIPI NOTI» al framework in termini di Servizi; Un tipo può essere sostituito o aggiunto in fase di warmup dell’applicazione.

Configuration: Services

Single-Instance:

Multi-Instance:

Page 18: Web Api – The HTTP Way

Configuration: Services

Single - Instance Multi - Instance

IActionValueBinder IApiExplorer IAssembliesResolver IBodyModelValidator IContentNegotiator IDocumentationProvider IHostBufferPolicySelector IHttpActionInvoker IHttpActionSelector IHttpControllerActivator IHttpControllerSelector IHttpControllerTypeResolver ITraceManager ITraceWriter IModelValidatorCache

IFilterProvider ModelBinderProvider ModelMetadataProvider ModelValidatorProvider ValueProviderFactory

Page 19: Web Api – The HTTP Way

DEMO SERVIZIImplementare IHttpControllerTypeResolvere IHttpControllerActivator

Page 20: Web Api – The HTTP Way

Oltre che a livello globale alcune impostazioni possono essere cambiate a livello (locale) per singolo Controller tramite un meccanismo di «override».

E’ possibile cambiare i seguenti settings:◦Media-Type formatters◦Parameter Binding Rules◦Services

Configuration: Per-Controller

Page 21: Web Api – The HTTP Way

Per usare la configurazione per controller è necessario creare un attributo che erediti dall’interfaccia IControllerConfiguration:

Configuration: Per-Controller

Page 22: Web Api – The HTTP Way

Blocco Message Handlers

protected Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){  //intercetto la richiesta e lavoro su un valore dell’header var requestDate = request.Headers.Date;       //eseguo la richesta e ottengo la risposta dal blocco controller         var response =  await base.SendAsync(request, cancellationToken);  //manipolo la risposta e lavoro su un valore dell’header        var responseDate = response.Headers.Date; //chiudo e restituisco la risposta       return response;}

Page 23: Web Api – The HTTP Way

Esisto 2 tipi di handlers◦ Built-IN◦ Custom (scriviamo noi)

Gli ultimi 2 handlerssi occupano di girare la richiesta al controller oppurtuno in base al meccanismo di routing;

Gli handlers possono essere registrati a livello:◦ Globale (in Configuration)◦ Per Route (su template route)

Catena di lavoro

Page 24: Web Api – The HTTP Way

DEMO Message HandlersCome manipolare richiesta e risposta HTTP tramite message handlers

Page 25: Web Api – The HTTP Way

Permette di mappare un controller con una risorsa e i suoi metodi con i verbi http (get, post, put, options, head, delete, patch):

template: api/{controller}/{id}

Per i metodi possiamo usare gli attributi AcceptVerbs, HttpPost, HttpGet, ecc...

Possiamo personalizzare il routing con defaults e constraints come in MVC.

Per tutte le azioni il cui nome non combacia con un verbo http , il default è il verbo POST

Routing - Guidato dai verbi Http

Page 26: Web Api – The HTTP Way

Permette di mappare le actions del controller con dei nomi che non sono collegati strettamente collegati ai verbi http:

template: services/{controller}/{action}/{id}

Ricordiamo che la regola d’oro nella valutazione delle routes è «First Win». Quindi la posizione in cui mettiamo le routes è importante.

Routing – Vecchio stile {action}

Page 27: Web Api – The HTTP Way

Possiamo debuggare le regole di routing:

Tramite il componente nuget: http://www.nuget.org/packages/WebApiRouteDebugger/

PM> Install-Package WebApiRouteDebugger

Routing - Debugging

Page 28: Web Api – The HTTP Way

DEMO ROUTINGCome funziona il routing basato sui verbi Http

Page 29: Web Api – The HTTP Way

WebApi – Blocco Controller

Page 30: Web Api – The HTTP Way

Usa le stesse convenzioni di ASP.NET MVC Esempio: GET: api/{controller} => api/Book◦ Estrae dal dizionario di routing il valore per la chiave

{controller}: «Book»◦ Appende la parola «Controller» al valore trovato:

«BookController»◦ Cerca tra i tipi candidati quello corrispondente al nome

trovato; Possiamo cambiare questa convenzione in base alle

nostre esigenze vedi IHttpControllerTypeResolver

Selezione del Controller

Page 31: Web Api – The HTTP Way

Selezione delle Actions

Page 32: Web Api – The HTTP Way

Sono ideali per gestire i «cross cutting concerns»: sicurezza, logging, transazionalità, validazione, mapping, ecc..Esistono vari tipi di filtri:1. Authorization Filters: vengono eseguiti prima del

ModelBinding (verifica identità, autorizzazione, check sicurezza)

2. Action Filters: vengono eseguiti prima e dopo l’invocazione di una action (ispezione request/response)

3. Exception Filters: vengono eseguiti quando si sollevano errori nel «Blocco Controllers»

I filtri possono essere configurati a livello di Configurazione, Per-Controller o Per-Action.

Action Filters

Page 33: Web Api – The HTTP Way

1. I filtri sono asincroni per definizione, anche se per semplicità viene fornita una versione sincrona per ognuno di essi.

2. Non esiste un filtro [HandleError] come in MVC, in WebApi possiamo scrivere un filtro globale per personalizzare il comportamento di default.

3. Esistono sempre i filtri [AllowAnonymous] e [Autorize] per la gestione della sicurezza

Action Filters

Page 34: Web Api – The HTTP Way

DEMO FILTRIVerrà illustrato come agisco i filtri all’interno del blocco controller.

Page 35: Web Api – The HTTP Way

Il meccanismo di binding crea i tipi .NET corrispondenti ai parametri delle actions partendo dalla richiesta HTTP:◦ I tipi semplici (Guid, DateTime, String) dall’URI tramite Model

Binder◦ I tipi complessi dal Body tramite i MediaType Formatters

Questo comportamento può essere cambiato agendo su alcuni punti di estensibilità:◦ IActionValueBinder◦ HttpParameterBinding

Binding dei Parametri

Page 36: Web Api – The HTTP Way

Schema di Binding

URI

HEADERS

BODY TIPI COMPLESSI

TIPI SEMPLICI

Richiesta HTTPModelBinder

ValueProvider

Media Type Formatters

OGNI TIPO

HttpParameterBinding

WebApi può leggere il BODY della richiesta una sola volta, quindi non è possibile associare più di un parametro al body.

TIPO CLR

Page 37: Web Api – The HTTP Way

DEMO BINDING Come creare dei bindings custom per i parametri delle actions

Page 38: Web Api – The HTTP Way

E’ il processo di selezione della migliore rappresentazione di una risorsa in risposta ad una richiesta del client;

Il client può richiedere tramite l’header HTTP Accept-* la formattazione della risposta in uno specifico formato (Media Type);

Il framework riesce a gestire in modo automatico questa situazione per i formati Xml e Json, ma nulla ci vieta di creare dei MediaType personalizzati;

WebApi – Negoziazione del Contenuto

Page 39: Web Api – The HTTP Way

Sono i componenti che si occupano di serializzare / deserializzare una risorsa. Entrano in gioco:

1. Dopo la creazione del risultato della Action2. In fase di Binding per i tipi complessi agendo sul body della richiesta

per reidratare i parametri delle Action

I Formatters possono essere gestiti a livello di Configurazione oppure a livello del Controller.

Possiamo creare nuovi formatter ereditando dalle classi: MediaTypeFormatter o BufferedMediaTypeFormatter. La prima utilizza metodi asincroni di lettura e scrittura mentre la seconda supporta un approccio sincrono.

Formatters

Page 40: Web Api – The HTTP Way

DEMO MEDIA FORMATTERCome creare un formatter custom per rappresentare una risorsa in formato CSV

Page 41: Web Api – The HTTP Way

Presente già in MVC Evoluta in WebApi con IDependencyResolver e

IDependencyScope (per richiesta) Prima di instanziare un servizio WebApi chiede al

resolver se esiste, in caso contrario utilizza l’implementazione di default

Lifetime degli oggetti◦ I controllers vengono creati per ogni richiesta◦ I message handlers e i servizi una sola volta all’avvio

dell’applicazione

WebApi – Iniezione delle Dipendenze

Page 42: Web Api – The HTTP Way

DEMO IOCCome implementare un DependecyResolver custom

Page 43: Web Api – The HTTP Way

IIS possiede un numero finito di threads per soddisfare le richieste.Se ci sono richieste che impegnano a lungo il server si rischia il blocco del server perché i threads risultano impegnati.

WebApi – Aync by Design

503

Page 44: Web Api – The HTTP Way

Async by DesignEsecuzione asincrona delle Action sul Controller se il tipo ritornato dal metodo è Task o Task<T>

Page 45: Web Api – The HTTP Way

Possiamo usare i Templates di progetto di Visual Studio 2012 (MVC4 + WebApi)

WebApi: Setup di un progetto

Oppure essere più snelli, creando un web project vuoto per ASP.NET e con NUGET fare il setup da linea di comando:

PM> Install-Package Microsoft.AspNet.WebApi

Page 46: Web Api – The HTTP Way

La DotDotNet è un'associazione culturale con il compito di promuovere la più ampia diffusione dell'informatica, della telematica, della multimedialità e dei collaborative tools, con particolare attenzione allo sviluppo di software su piattaforma Microsoft .NET. (dall’art. 1 dello statuto DotDotNet)

Associazione no-profit◦ Opera in tutta la regione

Gruppo di professionisti, studenti e appassionati. Feedback Adesione:

http://dotdotnet.org/content/Adesione.aspx

User Group .NET Emilia-Romagna