Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

¿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