SlideShare a Scribd company logo
1 of 29
www.xedotnet.org
Andrea Dottor
Microsoft MVP ASP.NET
@dottor
Creare API pubbliche, come
evitare gli errori comuni
Chi sono
Andrea Dottor
Microsoft MVP ASP.NET
www.dottor.net
andrea@dottor.net
@dottor
intro
• Il capo ti chiama
• Nuovo progetto
• Usare servizi REST pubblici per recuperare i dati
• Ma non i soliti che usano tutti
• Te li fa cercare a te, perché vuole qualcosa di particolare
• Fatichi a trovarli
• Scopri come (non) sono fatti
Sarà capitato anche a voi
Di perdervi cercando la documentazione
O volervi buttare di sotto
quando vi hanno obbligato ad utilizzare quelle API
credits:40 Carati – Man on a Ledge
Evitiamo gli errori comuni
• Dove sbagliano sempre gli altri?
• Mancanza di documentazione
• API e/o DTO che cambiano senza preavviso
• Uso errato degli Http-Method
• Autenticazione (o altro) non standard
• …
• Etica della reciprocità:
• "Comportati con chi ti è inferiore come vorresti che si comportasse
con te chi ti è superiore." (Lucio Anneo Seneca)
• "Non fare a nessuno ciò che non piace a te." (Libro di Tobia)
Le API sono una tua vetrina
• Alcuni clienti conosceranno le tue API prima di
conoscere te
• La prima impressione è spesso quella che conta
• API poco (o per niente) documentate è una delle
prime motivazioni per far si che non vengano
utilizzate
• API troppo complesse…sono la seconda
motivazione per far si che non vengano utilizzate
• L'adozione di standard ne facilita l'uso
alcuni semplici consigli
Esponi dei DTO (Data Transfert Object)
• Non ritornare MAI gli oggetti di business o le classi
del model dell'Entity Framework (o simili)
• Modifiche fatte a questi oggetti possono ripercuotersi su
chi utilizza le API
• Cambio di tipo di una proprietà
• Cambio del nome di una proprietà
• Cancellazione di una proprietà
• Esponendo le proprie classi non si ha scelta su quali
proprietà far vedere o nascondere
• E' preferibile creare degli oggetti DTO studiati sulle
reali necessità di chi dovrà utilizzare i vostri servizi
DEMO
DTO
Action e HTTP Method
1. I metodi in GET non devono modificare i dati!
2. Non utilizzate (solo) i nomi delle action per
specificare cosa fa un metodo.
Es:
/getAllCars
/createNewCar
/deleteAllRedCars
Uso corretto degli HTTP Method
HTTP Verb CRUD Entire Collection (e.g. /customers) Specific Item (e.g. /customers/{id})
POST Create 201 (Created), 'Location' header with
link to /customers/{id} containing
new ID.
404 (Not Found), 409 (Conflict) if
resource already exists..
GET Read 200 (OK), list of customers. Use
pagination, sorting and filtering to
navigate big lists.
200 (OK), single customer. 404 (Not
Found), if ID not found or invalid.
PUT Update/Replace 404 (Not Found), unless you want to
update/replace every resource in the
entire collection.
200 (OK) or 204 (No Content). 404
(Not Found), if ID not found or
invalid.
PATCH Update/Modify 404 (Not Found), unless you want to
modify the collection itself.
200 (OK) or 204 (No Content). 404
(Not Found), if ID not found or
invalid.
DELETE Delete 404 (Not Found), unless you want to
delete the whole collection—not
often desirable.
200 (OK). 404 (Not Found), if ID not
found or invalid.
Uso corretto degli Status Code
2xx Success
• 200 OK
• 201 Created
• 204 No Content
4xx Client Error
• 400 Bad Request
• 401 Unauthorized
• 403 Forbidden
• 404 Not Found
• 409 Conflict
5xx Server Error
• 500 Internal Server Error
Uso corretto degli Status Code
• Ritornare un oggetto di tipo IHttpActionResult
• Ritornare un oggetto di tipo HttpResponseMessage
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
if (film == null)
return NotFound();
http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results
DEMO
HTTP Method e Status Code
CORS
• Ricordarsi di abilitare CORS se vogliamo che le API siano
utilizzabili da tutti
• Di default di browser bloccano le chiamate JavaScript
verso altri domini
• Come?
• Aggiungere pacchetto nuget: Microsoft.AspNet.WebApi.Cors
• Abilitarlo nel file WebApiConfig.cs
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
• (oppure) Aggiungere pacchetto nuget: Microsoft.Owin.Cors
• Abilitarlo nel file Startup.cs
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
la parte noiosa
ma la più utile per chi deve manuntenere
o utilizzare le tue API
Versionamento
• Le API devono funzionare sempre
• Mai modificare i DTO in API pubbliche (utilizzate)
• Non modificare il tipo di una proprietà
• Mai modificare il nome di una proprietà
• Compreso purtroppo gli errori di ortografia
• Mai aggiungere o rimuovere proprietà
• E quindi?
• Versionare!
es: api/v1/prodotti
• Gli utilizzatori devono avere il tempo di migrare i propri
client verso la nuova versione
DEMO
versionamento
Documentazione
• Esporre delle API senza documentazione equivale
(quasi) a non avere delle API
• Cosa possiamo fare?
• Help Page
• Presente di default nei progetti ASP.NET Web API
• Swagger
• http://swagger.io/
• "Swagger is a simple yet powerful representation of your
RESTful API."
• Nuget: Install-Package Swashbuckle
Web API help page
Swagger
DEMO
documentazione
Testing
• MAI dare per scontato che una vostra modifica
funzioni
• Testare sempre le API prima di pubblicarle
• Evitate che sia il cliente a fare da tester
• Utilizzare un ambiente di pre-produzione (dove eseguire
i test)
postman
Per i pigri
• E' possibile far generare le collection per postman
• Semplifica/velocizza le operazione di testing
DEMO
postman
Chi sono
Andrea Dottor
Microsoft MVP ASP.NET
www.dottor.net
andrea@dottor.net
@dottor
Si ringrazia
L'evento di oggi è sponsorizzato da Andrea Agnoletto
https://www.linkedin.com/in/andreaagnoletto
speakers:
Feedback
http://goo.gl/forms/1SSdTxJbyT

More Related Content

What's hot

ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesAndrea Dottor
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPCAndrea Dottor
 
Sviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailSviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailDotNetMarche
 
Sviluppare Azure Web Apps
Sviluppare Azure Web AppsSviluppare Azure Web Apps
Sviluppare Azure Web AppsAndrea Dottor
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiAndrea Dottor
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingAndrea Dottor
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webAndrea Dottor
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e PostgresqlLucio Grenzi
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroAndrea Dottor
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side JavascriptMatteo Napolitano
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Codemotion
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101DotNetCampus
 
Node js: che cos'è e a che cosa serve?
Node js: che cos'è e a che cosa serve?Node js: che cos'è e a che cosa serve?
Node js: che cos'è e a che cosa serve?Flavius-Florin Harabor
 
Building Large Java Codebase with Bazel - CodeOne
Building Large Java Codebase with Bazel - CodeOneBuilding Large Java Codebase with Bazel - CodeOne
Building Large Java Codebase with Bazel - CodeOneNatan Silnitsky
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012Andrea Dottor
 

What's hot (20)

ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor Pages
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuni
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPC
 
Sviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle MonorailSviluppo Web Agile con Castle Monorail
Sviluppo Web Agile con Castle Monorail
 
Sviluppare Azure Web Apps
Sviluppare Azure Web AppsSviluppare Azure Web Apps
Sviluppare Azure Web Apps
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivati
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffolding
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e Postgresql
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuro
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side Javascript
 
Swagger loves WebAPI
Swagger loves WebAPISwagger loves WebAPI
Swagger loves WebAPI
 
Swagger loves webapi
Swagger loves webapiSwagger loves webapi
Swagger loves webapi
 
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
Java EE facile con Spring Boot - Luigi Bennardis - Codemotion Roma 2015
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101
 
Node js: che cos'è e a che cosa serve?
Node js: che cos'è e a che cosa serve?Node js: che cos'è e a che cosa serve?
Node js: che cos'è e a che cosa serve?
 
Silex, iniziamo
Silex, iniziamoSilex, iniziamo
Silex, iniziamo
 
Building Large Java Codebase with Bazel - CodeOne
Building Large Java Codebase with Bazel - CodeOneBuilding Large Java Codebase with Bazel - CodeOne
Building Large Java Codebase with Bazel - CodeOne
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
 

Viewers also liked

ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimizationAndrea Dottor
 
Multi-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaMulti-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaAndrea Dottor
 
Windows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoWindows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoAndrea Dottor
 
Il buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceIl buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceAndrea Dottor
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 
C#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivereC#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivereMatteo Valoriani
 
Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5Andrea Dottor
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del webAndrea Dottor
 

Viewers also liked (9)

ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimization
 
Multi-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaMulti-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache Cordova
 
Windows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoWindows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppo
 
Il buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceIl buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita felice
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 
C#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivereC#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivere
 
Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5
 
What's new in C# 6.0
What's new in C# 6.0What's new in C# 6.0
What's new in C# 6.0
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del web
 

Similar to Creare API pubbliche, come evitare gli errori comuni

Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteGiuseppe Toto
 
REST API fantastiche e dove trovarle
REST API fantastiche e dove trovarleREST API fantastiche e dove trovarle
REST API fantastiche e dove trovarleMarco Breveglieri
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in DelphiMarco Breveglieri
 
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesaHackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesaSimone Onofri
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Wellnet srl
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Eugenio Minardi
 
SEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion Protocol
SEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion ProtocolSEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion Protocol
SEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion Protocolsemrush_webinars
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryAlberto Buschettu
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai frameworkFrancesca1980
 
Smau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del ceroSmau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del ceroSMAU
 
Asp.net web api reloaded
Asp.net web api reloadedAsp.net web api reloaded
Asp.net web api reloadedPietro Libro
 
Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...
Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...
Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...Federico Villa
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storageameft
 

Similar to Creare API pubbliche, come evitare gli errori comuni (20)

Net core base
Net core baseNet core base
Net core base
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
 
REST API fantastiche e dove trovarle
REST API fantastiche e dove trovarleREST API fantastiche e dove trovarle
REST API fantastiche e dove trovarle
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
 
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesaHackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
 
Repository pattern
Repository patternRepository pattern
Repository pattern
 
Wcf data services
Wcf data servicesWcf data services
Wcf data services
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)
 
SEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion Protocol
SEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion ProtocolSEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion Protocol
SEMrush WebStudy Marathon - SEO Tecnico - Robots Exclusion Protocol
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai framework
 
Oai Data Adapter
Oai Data AdapterOai Data Adapter
Oai Data Adapter
 
Smau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del ceroSmau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del cero
 
Web api 2.0
Web api 2.0Web api 2.0
Web api 2.0
 
Drupal + Apache SOLR
Drupal + Apache SOLRDrupal + Apache SOLR
Drupal + Apache SOLR
 
Asp.net web api reloaded
Asp.net web api reloadedAsp.net web api reloaded
Asp.net web api reloaded
 
Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...
Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...
Tesi Triennale: Navigazione automatica e rilevazione di errori in applicazion...
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storage
 

More from Andrea Dottor

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScriptAndrea Dottor
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...Andrea Dottor
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Andrea Dottor
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3Andrea Dottor
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyAndrea Dottor
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheAndrea Dottor
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App ServiceAndrea Dottor
 

More from Andrea Dottor (9)

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScript
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core gradually
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cache
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App Service
 
ASP.NET Core
ASP.NET CoreASP.NET Core
ASP.NET Core
 

Creare API pubbliche, come evitare gli errori comuni

  • 1. www.xedotnet.org Andrea Dottor Microsoft MVP ASP.NET @dottor Creare API pubbliche, come evitare gli errori comuni
  • 2. Chi sono Andrea Dottor Microsoft MVP ASP.NET www.dottor.net andrea@dottor.net @dottor
  • 3. intro • Il capo ti chiama • Nuovo progetto • Usare servizi REST pubblici per recuperare i dati • Ma non i soliti che usano tutti • Te li fa cercare a te, perché vuole qualcosa di particolare • Fatichi a trovarli • Scopri come (non) sono fatti
  • 4. Sarà capitato anche a voi Di perdervi cercando la documentazione
  • 5. O volervi buttare di sotto quando vi hanno obbligato ad utilizzare quelle API credits:40 Carati – Man on a Ledge
  • 6. Evitiamo gli errori comuni • Dove sbagliano sempre gli altri? • Mancanza di documentazione • API e/o DTO che cambiano senza preavviso • Uso errato degli Http-Method • Autenticazione (o altro) non standard • … • Etica della reciprocità: • "Comportati con chi ti è inferiore come vorresti che si comportasse con te chi ti è superiore." (Lucio Anneo Seneca) • "Non fare a nessuno ciò che non piace a te." (Libro di Tobia)
  • 7. Le API sono una tua vetrina • Alcuni clienti conosceranno le tue API prima di conoscere te • La prima impressione è spesso quella che conta • API poco (o per niente) documentate è una delle prime motivazioni per far si che non vengano utilizzate • API troppo complesse…sono la seconda motivazione per far si che non vengano utilizzate • L'adozione di standard ne facilita l'uso
  • 9. Esponi dei DTO (Data Transfert Object) • Non ritornare MAI gli oggetti di business o le classi del model dell'Entity Framework (o simili) • Modifiche fatte a questi oggetti possono ripercuotersi su chi utilizza le API • Cambio di tipo di una proprietà • Cambio del nome di una proprietà • Cancellazione di una proprietà • Esponendo le proprie classi non si ha scelta su quali proprietà far vedere o nascondere • E' preferibile creare degli oggetti DTO studiati sulle reali necessità di chi dovrà utilizzare i vostri servizi
  • 11. Action e HTTP Method 1. I metodi in GET non devono modificare i dati! 2. Non utilizzate (solo) i nomi delle action per specificare cosa fa un metodo. Es: /getAllCars /createNewCar /deleteAllRedCars
  • 12. Uso corretto degli HTTP Method HTTP Verb CRUD Entire Collection (e.g. /customers) Specific Item (e.g. /customers/{id}) POST Create 201 (Created), 'Location' header with link to /customers/{id} containing new ID. 404 (Not Found), 409 (Conflict) if resource already exists.. GET Read 200 (OK), list of customers. Use pagination, sorting and filtering to navigate big lists. 200 (OK), single customer. 404 (Not Found), if ID not found or invalid. PUT Update/Replace 404 (Not Found), unless you want to update/replace every resource in the entire collection. 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. PATCH Update/Modify 404 (Not Found), unless you want to modify the collection itself. 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. DELETE Delete 404 (Not Found), unless you want to delete the whole collection—not often desirable. 200 (OK). 404 (Not Found), if ID not found or invalid.
  • 13. Uso corretto degli Status Code 2xx Success • 200 OK • 201 Created • 204 No Content 4xx Client Error • 400 Bad Request • 401 Unauthorized • 403 Forbidden • 404 Not Found • 409 Conflict 5xx Server Error • 500 Internal Server Error
  • 14. Uso corretto degli Status Code • Ritornare un oggetto di tipo IHttpActionResult • Ritornare un oggetto di tipo HttpResponseMessage Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); if (film == null) return NotFound(); http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results
  • 15. DEMO HTTP Method e Status Code
  • 16. CORS • Ricordarsi di abilitare CORS se vogliamo che le API siano utilizzabili da tutti • Di default di browser bloccano le chiamate JavaScript verso altri domini • Come? • Aggiungere pacchetto nuget: Microsoft.AspNet.WebApi.Cors • Abilitarlo nel file WebApiConfig.cs config.EnableCors(new EnableCorsAttribute("*", "*", "*")); • (oppure) Aggiungere pacchetto nuget: Microsoft.Owin.Cors • Abilitarlo nel file Startup.cs app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
  • 17. la parte noiosa ma la più utile per chi deve manuntenere o utilizzare le tue API
  • 18. Versionamento • Le API devono funzionare sempre • Mai modificare i DTO in API pubbliche (utilizzate) • Non modificare il tipo di una proprietà • Mai modificare il nome di una proprietà • Compreso purtroppo gli errori di ortografia • Mai aggiungere o rimuovere proprietà • E quindi? • Versionare! es: api/v1/prodotti • Gli utilizzatori devono avere il tempo di migrare i propri client verso la nuova versione
  • 20. Documentazione • Esporre delle API senza documentazione equivale (quasi) a non avere delle API • Cosa possiamo fare? • Help Page • Presente di default nei progetti ASP.NET Web API • Swagger • http://swagger.io/ • "Swagger is a simple yet powerful representation of your RESTful API." • Nuget: Install-Package Swashbuckle
  • 21. Web API help page
  • 24. Testing • MAI dare per scontato che una vostra modifica funzioni • Testare sempre le API prima di pubblicarle • Evitate che sia il cliente a fare da tester • Utilizzare un ambiente di pre-produzione (dove eseguire i test)
  • 25. postman Per i pigri • E' possibile far generare le collection per postman • Semplifica/velocizza le operazione di testing
  • 27. Chi sono Andrea Dottor Microsoft MVP ASP.NET www.dottor.net andrea@dottor.net @dottor
  • 28. Si ringrazia L'evento di oggi è sponsorizzato da Andrea Agnoletto https://www.linkedin.com/in/andreaagnoletto speakers: