todo sobre mis apis

84

Upload: daniel-cerecedo

Post on 18-Jul-2015

418 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Todo sobre mis APIs
Page 2: Todo sobre mis APIs

Byteflair

http://byteflair.com

Daniel Cerecedo@dcerecedo

Victor Hernandez@uvehachebe

Page 3: Todo sobre mis APIs

AgendaAgenda

ArquitecturaArquitectura RESTDeveloper UXREST sobre HTTPHypermedia APIsVistas Adaptativas

Actualizaciones & ConcurrenciaI18nLenguajes de especificaciónHerramientas de prueba

Byteflair

Page 4: Todo sobre mis APIs

ArquitecturaArquitectura

Byteflair

Page 5: Todo sobre mis APIs

Separación de responsabilidades de presentación y procesamiento

Portabilidad de la interfaz de usuario

Simplicidad del servidor

Capacidad de modificar los componentes por separado

ServidorCliente

Byteflair

Arquitectura RESTArquitectura RESTCliente/ServidorCliente/Servidor

Page 6: Todo sobre mis APIs

Servidor

Mensajes autodescriptivos: semántica, datos, metadatos y contexto

Cliente2:Cliente

Cliente1:Cliente

Visibilidad Fiabilidad Escalabilidad

Rendimiento de red

Control sobre el comportamiento del cliente

Byteflair

Arquitectura RESTArquitectura RESTSin estadoSin estado

Page 7: Todo sobre mis APIs

Cliente

Elimina total o parcialmente algunas de las interacciones

Rendimiento de red

Rendimiento percibido por el usuario

Cache

Servidor

Cache

Byteflair

Arquitectura RESTArquitectura RESTCacheableCacheable

Page 8: Todo sobre mis APIs

1.Identificación por URIs2.Mensajes autodescriptivos3.Manipulación a través de representaciones4.HATEOAS

Simplicidad

Byteflair

Arquitectura RESTArquitectura RESTInterfaz uniformeInterfaz uniforme

Page 9: Todo sobre mis APIs

Cliente

Cada capa solo conoce a su vecina

Simplicidad

Latencia

Cache

Servidor

Cache

Proxy

Cache

Balanceador

Byteflair

Arquitectura RESTArquitectura RESTPor capasPor capas

Page 10: Todo sobre mis APIs

Developer UXDeveloper UX

El desarrollador como destinatario del contenido, no los navegadores

Byteflair

Page 11: Todo sobre mis APIs

¿Porqué REST sobre HTTP?¿Porqué REST sobre HTTP?

Byteflair

“Los límites de mi lenguaje son los límites de mi nundo”

Todo el mundo habla HTTPLudwig Wittgenstein

Page 12: Todo sobre mis APIs

REST sobre HTTPREST sobre HTTP

Separar la representación del recurso de los metadatos de la petición

Representación Body→Metadatos Headers→

Byteflair

Page 13: Todo sobre mis APIs

REST sobre HTTPREST sobre HTTP

Utiliza el HTTP Status Code para dar información acerca del resultado de la petición

2xx Ok→4xx El cliente ha hecho algo mal→

5xx El servidor ha fallado →

Byteflair

Page 14: Todo sobre mis APIs

REST sobre HTTPREST sobre HTTP

Utiliza los HTTP Status Codes existentes que mejor se adapten a la situación

Añade información específica cuando se produzca un error

Byteflair

Page 15: Todo sobre mis APIs

REST sobre HTTPREST sobre HTTP

Byteflair

Error HTTP

Error de negocio

Error técnico

Page 16: Todo sobre mis APIs

HypermediaHypermedia

Byteflair

Page 17: Todo sobre mis APIs

HypermediaHypermedia

Byteflair

Page 18: Todo sobre mis APIs

HypermediaHypermedia

Byteflair

Page 19: Todo sobre mis APIs

HypermediaHypermedia

Modela el dominio del problemaIdentifica los recursos del dominio

Identifica las transiciones de estado del sistemaDistingue entre estructura interna y lo que expones como recurso

Byteflair

¡No expongas la base de datos!

Page 20: Todo sobre mis APIs

HypermediaHypermediaRecursos del dominio

Vehicles DriversUsers Owners

SessionsTransiciones de estado

Crear recursosFiltrar recursos

Asignar conductor a vehículoActivar sesión: conductor + vehículo

Desactivar sesiónByteflair

Page 21: Todo sobre mis APIs

HypermediaHypermedia

Definir los formatos de representaciónMime Types

Definir roles para cada control hypermediaRel Types

Convenciones semánticasPOST, PUT, GET, DELETE

Byteflair

Page 22: Todo sobre mis APIs

HypermediaHypermediaGET /HeadersLink: <https://api.domain.com/vehicles>; rel=”vehicles”: <https://api.domain.com/users>; rel=”users”: <https://api.domain.com/sessions>; rel=”sessions”Body...

Byteflair

Page 23: Todo sobre mis APIs

HypermediaHypermedia

GET /vehiclesHeadersLink: <https://api.domain.com/vehicles?page=1&size=20>; rel=”next”Body[ {... }, {…}, ...] Control links

Byteflair

Page 24: Todo sobre mis APIs

HypermediaHypermedia

GET /sessions/1374Body{ ….

“vehicle”:”https://api.domain.com/vehicles/1”,“driver”:”https://api.domain.com/users/1”

}

También son control links.

Aplica las convenciones para obtener el significado completo!!

Byteflair

Page 25: Todo sobre mis APIs

HypermediaHypermedia

GET /vehicles/1Body{ ….

“owner”:”https://api.domain.com/users/1”}

Relation types specify the role of the link

Byteflair

Page 26: Todo sobre mis APIs

HypermediaHypermedia

El cliente debe descubrir su nivel de acceso a cada recurso

Options

Byteflair

Page 27: Todo sobre mis APIs

HypermediaHypermedia

ConvencionesRel Types, Media Types, Methods, Status Codes

Byteflair

..o qué debe saber

el desarrollador

de antemano

Las convenciones se convierten en acoplamiento

Page 28: Todo sobre mis APIs

HypermediaHypermedia

Byteflair

HALHAL

http://stateless.co/hal_specification.html

Page 29: Todo sobre mis APIs

HypermediaHypermedia

Como proveedor, minimiza el número de cosas que debes saber de antemano

sobre un API

Byteflair

Page 30: Todo sobre mis APIs

HypermediaHypermedia

No se consigue desacoplar un

cliente de su servidorcon magia

Byteflair

Page 31: Todo sobre mis APIs

Vistas adaptativasVistas adaptativas

Byteflair

Page 32: Todo sobre mis APIs

Vistas adaptativasVistas adaptativas

Distintos contextos de seguridad requieren vistas diferentes sobre los

mismos datos

Byteflair

Page 33: Todo sobre mis APIs

Un administrador debe poder ver todos los datos de un usuario

Un usuario puede ver todos sus datosUn usuario solo puede ver los datos públicos de los

demás usuarios

Scenario

Byteflair

Vistas adaptativasVistas adaptativas

Page 34: Todo sobre mis APIs

/users/{id}/owner/users/{id}/admin/users/{id}

Una URI por cada rol de seguridad

Scenario

Byteflair

Vistas adaptativasVistas adaptativas

Page 35: Todo sobre mis APIs

Descomponer el recursoDar diferentes niveles de acceso a cada recurso

Scenario

/users/{id}/users/{id}/my-private-data/users/{id}/data-about-me-only-the-admin-knows

Byteflair

Vistas adaptativasVistas adaptativas

Page 36: Todo sobre mis APIs

Un único recursoMúltiples vistas sobre el mismo recurso

Seleccionamos la vista en runtime

Scenario

/users/{id}

Byteflair

Vistas adaptativasVistas adaptativas

Page 37: Todo sobre mis APIs

Actualizaciones & Concurrencia

Byteflair

Page 38: Todo sobre mis APIs

Dos clientes tratan de actualizar el mismo recurso de forma concurrente

La representación es el estado de la aplicación

Debemos evitar que la segunda petición actualice el recurso a partir de una representación obsoleta

Actualizaciones & ConcurrenciaActualizaciones & ConcurrenciaScenario

Byteflair

Page 39: Todo sobre mis APIs

Comparar la representación que llega con el recurso existente...

Actualizaciones & ConcurrenciaActualizaciones & Concurrencia

Byteflair

Page 40: Todo sobre mis APIs

Comparar la representación que llega con el recurso existente...

Si no son iguales, rechazar...

Actualizaciones & ConcurrenciaActualizaciones & Concurrencia

Byteflair

Podemos usar el ETAG

Page 41: Todo sobre mis APIs

Comparar la representación que llega con el recurso existente...

Si no son iguales, rechazar...Si es posible, informar al cliente de las violaciones

Actualizaciones & ConcurrenciaActualizaciones & Concurrencia

Byteflair

Page 42: Todo sobre mis APIs

Peticiones asíncronasPeticiones asíncronas

Byteflair

Page 43: Todo sobre mis APIs

Como identificamos peticiones intrínsecamente asíncronas?

Existen transiciones de estado fuera del control del cliente

No tiene sentido devolver una representación por que no conocemos el estado del recurso tras la llamada

Byteflair

Peticiones asíncronasPeticiones asíncronas

Page 44: Todo sobre mis APIs

Peticiones asíncronasPeticiones asíncronasScenario

Ok

NeedsRepair

Repaired

Awaiting

Byteflair

Los camiones se revisan regularmente y se seleccionan para reparación

Page 45: Todo sobre mis APIs

Peticiones asíncronasPeticiones asíncronasScenario

Ok

NeedsRepair

Repaired

Bajo mi controlAwaiting

Byteflair

Los camiones se revisan regularmente y se seleccionan para reparación

Page 46: Todo sobre mis APIs

Peticiones asíncronasPeticiones asíncronasScenario

Ok

NeedsRepair

Repaired

Bajo mi controlAwaiting

PUT /trucks/6/repair202 Accepted

Byteflair

Los camiones se revisan regularmente y se seleccionan para reparación

Page 47: Todo sobre mis APIs

Si existen peticiones que consumen mucho tiempo...

Byteflair

Peticiones asíncronasPeticiones asíncronas

Page 48: Todo sobre mis APIs

Si existen peticiones que consumen mucho tiempo...

las hacemos asíncronas!

Byteflair

Peticiones asíncronasPeticiones asíncronas

Page 49: Todo sobre mis APIs

Speaking in silverSpeaking in silveri18ni18n

Byteflair

Page 50: Todo sobre mis APIs

Speaking in silverSpeaking in silveri18ni18n

GET /i18n/es_ESBody{

“country” : “ES”,“lang”: “es”,“data” : { “key”: “localized message”, ….}

}

Byteflair

Page 51: Todo sobre mis APIs

Byteflair

API API SpecificationSpecification

Page 52: Todo sobre mis APIs

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Apiary.io

Primera versión: Abril 2013

Objetivos: Simplicidad Interacción y dialogo entre desarrolladores y consumidores

Page 53: Todo sobre mis APIs

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Apiary editor:https://app.apiary.io

Editor local:Atom + Snowcrash + Aglio + Atom plugin

Page 54: Todo sobre mis APIs

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Ejemplo

Page 55: Todo sobre mis APIs

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Gist : https://gist.github.com/victorhernandezbermejo/9d5a9448a487a71dd503

Blueprint: http://docs.bfphonebook.apiary.io/

Page 56: Todo sobre mis APIs

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Enlaces: Sitio web:

https://apiblueprint.org/ En github:

https://github.com/apiaryio/api-blueprint Especificación del lenguaje:

https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md

Page 57: Todo sobre mis APIs

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Algunas herramientas

Apiary: http://apiary.io

Dredd: https://github.com/apiaryio/dredd

Drakov: https://www.npmjs.com/package/drakov

Dredd: https://github.com/apiaryio/dredd

Aglio: https://github.com/danielgtaylor/aglio

Page 58: Todo sobre mis APIs

Byteflair

SwaggerSwaggerAPI API SpecificationSpecification

Reverb

Primera versión: Julio 2011

Objetivos: En un principio documentación de APIs ya existentes. En su versión 2.0 cambiaron el enfoque hacia el diseño y la

especificación.

Page 59: Todo sobre mis APIs

Byteflair

SwaggerSwaggerAPI API SpecificationSpecification

Swagger editor:http://editor.swagger.io/

En local:https://github.com/Byteflair/docker-swagger-editor

docker pull byteflair/swagger-editor docker run -d -p <port>:9000 byteflair/swagger-editor

Page 60: Todo sobre mis APIs

Byteflair

SwaggerSwaggerAPI API SpecificationSpecification

Enlaces: Sitio web:

http://swagger.io/ En github:

https://github.com/swagger-api Especificación del lenguaje:

https://github.com/swagger-api/swagger-spec

Page 61: Todo sobre mis APIs

Byteflair

SwaggerSwaggerAPI API SpecificationSpecification

Ejemplo

Page 62: Todo sobre mis APIs

Byteflair

SwaggerSwaggerAPI API SpecificationSpecification

Gist : https://gist.github.com/victorhernandezbermejo/efd8093ec45db46836cf

Page 63: Todo sobre mis APIs

Byteflair

RAMLRAMLAPI API SpecificationSpecification

Mulesoft

Primera versión: Septiembre 2013

Objetivos: Dar un mayor peso a la especificación del API Poder obtener información de todos los actores involucrados lo antes

posible.

Page 64: Todo sobre mis APIs

Byteflair

RAMLRAMLAPI API SpecificationSpecification

API Designer:http://api-portal.anypoint.mulesoft.com/raml/api-designer

Imagen Docker: https://github.com/Byteflair/docker-raml-editor

docker pull byteflair/raml-editordocker run -d -p <port>:9013 byteflair/raml-editor

Page 65: Todo sobre mis APIs

Byteflair

RAMLRAMLAPI API SpecificationSpecification

Enlaces: Sitio web:

http://raml.org/ En github:

https://github.com/raml-org Especificación del lenguaje:

https://github.com/raml-org/raml-spec

Page 66: Todo sobre mis APIs

Byteflair

RAMLRAMLAPI API SpecificationSpecification

Ejemplo

Page 67: Todo sobre mis APIs

Byteflair

RAMLRAMLAPI API SpecificationSpecification

Gist : https://gist.github.com/victorhernandezbermejo/f5db381cb4cf395f47d1

Page 68: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Comunidad de usuarios +

Watch Star Fork Questions

Apiary Blueprint 115 1,891 561 489

Swagger 221 2,482 822 1,541

RAML 96 1,080 77 120

Datos a fecha 16/03/2015

Page 69: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Comunidad de usuarios +

Watch Star Fork Questions

Apiary Blueprint 115 1,891 561 489

Swagger 221 2,482 822 1,541

RAML 96 1,080 77 120

Page 70: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Page 71: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Page 72: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Page 73: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Page 74: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Page 75: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Concisión

Page 76: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Concisión

Herramientas

Page 77: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Concisión

Herramientas

Documentación

Page 78: Todo sobre mis APIs

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Concisión

Herramientas

Documentación

Total 27 27 35

Page 79: Todo sobre mis APIs

Byteflair

API API SpecificationSpecificationConclusionesConclusiones

Page 80: Todo sobre mis APIs

Byteflair

ToolsToolsDemoDemo

Page 81: Todo sobre mis APIs

Byteflair

ToolsToolsLinksLinks

Postman: http://www.getpostman.com/

Runscope: https://www.runscope.com/

Soap UI: http://www.soapui.org/

Page 82: Todo sobre mis APIs

Byteflair

ToolsToolsGistsGists

Gist : https://gist.github.com/victorhernandezbermejo/854271c55cba55749c1d

Page 83: Todo sobre mis APIs

“Las armas deben adaptarse a tus cualidades personales y

debes ser capaz de manejarlas” Miyamoto Mushashi

Byteflair

Page 84: Todo sobre mis APIs

?ThanksThanks GraciasGracias

http://byteflair.com

Daniel Cerecedo@dcerecedo

Victor Hernandez@uvehachebe