¿Qué es una API?
Cualquier interfaz bien definida que
especifique los servicios que un componente,
módulo o aplicación ofrece a otras piezas de
software.
Slide 4
Slide 4 text
¿Qué es una API?
Es una interfaz de usuario
para programadores
Slide 5
Slide 5 text
Web APIs
Slide 6
Slide 6 text
REST vs SOAP
Slide 7
Slide 7 text
REST vs SOAP RPC
Slide 8
Slide 8 text
REST vs RPC
Slide 9
Slide 9 text
Web APIs
Slide 10
Slide 10 text
¿Qué es REST?
REpresentational State Transfer
Es un estilo de arquitectura para
desarrollar sistemas distribuidos
Slide 11
Slide 11 text
Restricciones REST
Slide 12
Slide 12 text
Interfaz uniforme
Interfaz uniforme
Slide 13
Slide 13 text
Interfaz uniforme
Interfaz uniforme
Slide 14
Slide 14 text
HATEOAS
HATEOAS
Hypermedia as the Engine of
Application State
Slide 15
Slide 15 text
Modelo de madurez de Richardson
GLORIA
DE REST
Slide 16
Slide 16 text
Nivel 0: The SWAMP of POX
• Única URI de entrada
• Un solo verbo HTTP
• XML-RPC / SOAP / POX
Crear un cliente
POST http://localhost/api
Obtener un cliente
POST http://localhost/api
Slide 17
Slide 17 text
NIVEL 1: Recursos
• Cada recursos tiene su URI
• Un solo verbo HTTP (normalmente GET o POST)
• Los verbos no tienen significado
Crear un cliente
POST http://localhost/api/clientes
Obtener un coche
POST http://localhost/api/coches/{id}
Slide 18
Slide 18 text
NIVEL 2: Verbos HTTP
• Varias URI, utilizando múltiples verbos
• Uso correcto de los códigos de respuesta
• Expone estado, no el comportamiento
Crear un cliente
POST http://localhost/api/clientes
201 Created (Cliente)
Obtener un cliente
GET http://localhost/api/clientes/{id}
200 Accepted (Cliente)
Slide 19
Slide 19 text
Verbos HTTP
CRUD* SEGURO IDEMPOTENTE
GET READ SI SI
HEAD SI SI
POST CREATE NO NO
PUT UPDATE/
REPLACE
NO SI
DELETE DELETE NO SI
PATCH UPDATE/
MODIFY
NO NO
OPTIONS - SI SI
Slide 20
Slide 20 text
Códigos de estado HTTP
Peticiones Correctas Errores del cliente Errores del servidor
200 OK 400 Bad Request 500 Internal Server Error
201 Created 401 Unauthorized
204 No Content 403 Forbidden
404 Not Found
405 Method Not Allowed
410 Gone
415 Unsupported Media Type
422 Unprocessable Entity
429 Too Many Requests
https://httpstatuses.com/
Slide 21
Slide 21 text
NIVEL 3: Controles Hypermedia
• Los recursos son autodescriptivos
• HATEOAS
• Expone estado y comportamiento
Obtener un cliente
GET http://localhost/api/clientes/3
200 Accepted (Cliente + enlaces)
“links”: [
{ “href”: http://localhost/api/clientes/3, “rel”: “self”, “method” : “GET” },
{ “href”: http://localhost/api/clientes/3, “rel”: “delete_cliente”, “method” : “DELETE” }
]
Slide 22
Slide 22 text
¿Es nuestra API RESTful?
Según Roy Fielding… una API sólo puede
considerarse RESTful cuando se ajusta a
todas las restricciones de REST
Slide 23
Slide 23 text
¿Es nuestra API RESTful?
Slide 24
Slide 24 text
No content
Slide 25
Slide 25 text
ASP.NET Core
.NET Framework .NET Core
Platform for .NET applications on Windows Cross-platform, modular libraries & runtime
optimized for server and cloud workloads
Slide 26
Slide 26 text
No content
Slide 27
Slide 27 text
Creando un proyecto ASP.NET Core
Instalar .NET Core 2.0 desde http://dot.net/core
Slide 28
Slide 28 text
Configuración de la aplicación
Inicialización del host
Configuración servicios (DI)
Configuración Middlewares
Slide 29
Slide 29 text
Middleware
Request
Response
Slide 30
Slide 30 text
No content
Slide 31
Slide 31 text
Definición del API
Operación Verbo Recurso
Listado de clientes GET /clientes/
Consulta de un cliente GET /clientes/{id}
Crear nuevo cliente POST /clientes/
Actualizar información de un cliente PUT/PATCH /clientes/{id}
Eliminar un cliente DELETE /clientes/{id}
Listado de presupuestos de un cliente GET /clientes/{id}/presupuestos
Slide 32
Slide 32 text
Consulta de un recurso
GET /clientes/{id}
Resultado Cuerpo Código de respuesta
Cliente encontrado Cliente 200 Accepted
Cliente no encontrado - 404 Not Found
Respuesta
Slide 33
Slide 33 text
Consulta de colecciones
GET /clientes/
Resultado Cuerpo Código de respuesta
Hay clientes Listado de clientes 200 Accepted
No hay clientes Listado vacío 200 Accepted
Respuesta
Slide 34
Slide 34 text
Creando un recurso
POST /clientes
Resultado Cuerpo Código de respuesta
Cliente creado Cliente 201 Created
Cuerpo incorrecto Mensaje de error 400 Bad Request
Errores de validación Mensaje de error 422 Unprocessable Entity
Error de servidor Mensaje de error 500 Internal Server Error
Respuesta
{
“nombre”: “Carlos”,
“apellidos”: “Saez Dorado”,
“telefono”: “123456789”,
“esVip”: true
}
También es posible utilizar PUT para crear nuevos recursos
[Location Header]
Slide 35
Slide 35 text
Actualizando un recurso
PUT /clientes/{id}
{
“nombre”: “Carlos”,
“apellidos”: “Saez Dorado”,
“telefono”: “123456789”,
“esVip”: true
}
Resultado Cuerpo Código de respuesta
Cliente actualizado Cliente 200 Accepted
Cliente no encontrado 404 Not Found
Cuerpo incorrecto Mensaje de error 400 Bad Request
Errores de validación Mensaje de error 422 Unprocessable Entity
Error de servidor Mensaje de error 500 Internal Server Error
Slide 36
Slide 36 text
Actualizando un recurso parcialmente
PATCH /clientes/{id}
[
{ "op": "replace", "path": "/nombre", "value": "Jose" }
]
Resultado Cuerpo Código de respuesta
Cliente actualizado Cliente 200 Accepted
Cliente no encontrado 404 Not Found
Cuerpo incorrecto Mensaje de error 400 Bad Request
Errores de validación Mensaje de error 422 Unprocessable Entity
Error de servidor Mensaje de error 500 Internal Server Error
JSON PATCH
Slide 37
Slide 37 text
Borrando un recurso
DELETE /clientes/{id}
Resultado Cuerpo Código de respuesta
Cliente borrado - 204 No Content
Cliente no encontrado - 404 Not Found
Error de servidor Mensaje de error 500 Internal Server Error
Respuesta
Slide 38
Slide 38 text
Relaciones
GET /clientes/{id}/presupuestos
POST /clientes/{id}/presupuestos
DELETE /clientes/{id}/presupuestos/
{prespuestoId}
Slide 39
Slide 39 text
Filtrado, paginación y ordenación
GET /clientes?esVip=true
GET /clientes?orderBy=name
GET /clientes?page=2
GET /clientes?query=“Carlos”
Si utilizamos demasiados parámetros debemos valorar usar POST
Incluimos información de la paginación en el body y en el Link Header
Slide 40
Slide 40 text
Otras acciones
GET /clientes/favoritos
POST /clientes/{idCliente}/presupuestos/
{id}/aprobado
POST /busqueda
Slide 41
Slide 41 text
Embeded + Objetos parciales
GET /clientes?fields=id,nombre
GET /clientes?embed=presupesto.id,
prespuesto.importe
GET /clientes?fileds=id,nombre
&embed=presupesto.id,
prespuesto.importe
Slide 42
Slide 42 text
Formatos
Favorecer JSON
el cual ya se aplica por defecto
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
});
}
Otros formatos (p.ej. XML)
Slide 43
Slide 43 text
Hypermedia
• JSON-LD
• HAL
• JSON API
• COLLECTION+JSON
• SIREN
Representación en HAL
Slide 44
Slide 44 text
Shared vocabularies
Slide 45
Slide 45 text
Documentación + Schema
Slide 46
Slide 46 text
Documentación + Schema
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = “API", Version =
"v1" }); });}
public void Configure(IApplicationBuilder app)
{
app.UseSwagger();
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1”);} );
}
Slide 47
Slide 47 text
Compresión gzip
Mejor utilizar la del servidor (IIS, Apache…)
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure(options => options.Level =
System.IO.Compression.CompressionLevel.Optimal);
services.AddResponseCompression();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseResponseCompression();
app.UseMvc();
}
Slide 48
Slide 48 text
Otros
• Seguridad
• API Keys, OAuth2, JWT…
• Rate limits
• SSL
• Autorización y autenticación (Status Code: 401, 403…)
• Caching
• Etag, Last Modified Since
• Versionado API
• URL, Headers, Media Type…
Slide 49
Slide 49 text
Libros recomendados
Slide 50
Slide 50 text
Referencias
ProgrammableWeb
https://www.programmableweb.com/
Richardson Maturity Model – Martin Fowler
https://martinfowler.com/articles/richardsonMaturityModel.html
Understanding RPC Vs REST For HTTP APIs - Phil Sturgeon
https://www.smashingmagazine.com/2016/09/understanding-rest-and-rpc-for-
http-apis/
A Response to REST is the new SOAP - Phil Sturgeon
https://philsturgeon.uk/api/2017/12/18/rest-confusion-explained/
KNOW YOUR HTTP * WELL
https://github.com/for-GET/know-your-http-well
http-decision-diagram
https://github.com/for-GET/http-decision-diagram
Slide 51
Slide 51 text
Referencias
Tesis doctoral de Roy Fielding
http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
Best Practices for Designing a Pragmatic RESTful API - Vinay Sahni
http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
API Stylebook
http://apistylebook.com/
REST APIs must be hypertext-driven - Roy Fielding
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
GraphQL ha muerto: Vivan las APIs REST con Hypermedia - Jorge Ferrer y Jose
Manuel Navarro
https://www.youtube.com/watch?v=ud1fWXACWm0
Open API Initiative
https://www.openapis.org/
Slide 52
Slide 52 text
Referencias
API Handyman
https://apihandyman.io/
Documentación ASP .NET Core
https://docs.microsoft.com/es-es/aspnet/core/
Fanie Reynders
https://reynders.co/
ASP .NET Core Fundamentals – Carlos Landeras
https://www.youtube.com/watch?v=xWqKA5T7QUA
http://www.innovarioja.tv/index.php/video/ver/1792
Building a RESTful API with ASP .NET Core - Kevin Dockx (Pluralsight)
https://www.pluralsight.com/courses/asp-dot-net-core-restful-api-building