todo sobre mis apis

Post on 18-Jul-2015

420 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Byteflair

http://byteflair.com

Daniel Cerecedo@dcerecedo

Victor Hernandez@uvehachebe

AgendaAgenda

ArquitecturaArquitectura RESTDeveloper UXREST sobre HTTPHypermedia APIsVistas Adaptativas

Actualizaciones & ConcurrenciaI18nLenguajes de especificaciónHerramientas de prueba

Byteflair

ArquitecturaArquitectura

Byteflair

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

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

Cliente

Elimina total o parcialmente algunas de las interacciones

Rendimiento de red

Rendimiento percibido por el usuario

Cache

Servidor

Cache

Byteflair

Arquitectura RESTArquitectura RESTCacheableCacheable

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

Simplicidad

Byteflair

Arquitectura RESTArquitectura RESTInterfaz uniformeInterfaz uniforme

Cliente

Cada capa solo conoce a su vecina

Simplicidad

Latencia

Cache

Servidor

Cache

Proxy

Cache

Balanceador

Byteflair

Arquitectura RESTArquitectura RESTPor capasPor capas

Developer UXDeveloper UX

El desarrollador como destinatario del contenido, no los navegadores

Byteflair

¿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

REST sobre HTTPREST sobre HTTP

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

Representación Body→Metadatos Headers→

Byteflair

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

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

REST sobre HTTPREST sobre HTTP

Byteflair

Error HTTP

Error de negocio

Error técnico

HypermediaHypermedia

Byteflair

HypermediaHypermedia

Byteflair

HypermediaHypermedia

Byteflair

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!

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

HypermediaHypermedia

Definir los formatos de representaciónMime Types

Definir roles para cada control hypermediaRel Types

Convenciones semánticasPOST, PUT, GET, DELETE

Byteflair

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

HypermediaHypermedia

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

Byteflair

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

HypermediaHypermedia

GET /vehicles/1Body{ ….

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

Relation types specify the role of the link

Byteflair

HypermediaHypermedia

El cliente debe descubrir su nivel de acceso a cada recurso

Options

Byteflair

HypermediaHypermedia

ConvencionesRel Types, Media Types, Methods, Status Codes

Byteflair

..o qué debe saber

el desarrollador

de antemano

Las convenciones se convierten en acoplamiento

HypermediaHypermedia

Byteflair

HALHAL

http://stateless.co/hal_specification.html

HypermediaHypermedia

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

sobre un API

Byteflair

HypermediaHypermedia

No se consigue desacoplar un

cliente de su servidorcon magia

Byteflair

Vistas adaptativasVistas adaptativas

Byteflair

Vistas adaptativasVistas adaptativas

Distintos contextos de seguridad requieren vistas diferentes sobre los

mismos datos

Byteflair

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

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

Una URI por cada rol de seguridad

Scenario

Byteflair

Vistas adaptativasVistas adaptativas

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

Un único recursoMúltiples vistas sobre el mismo recurso

Seleccionamos la vista en runtime

Scenario

/users/{id}

Byteflair

Vistas adaptativasVistas adaptativas

Actualizaciones & Concurrencia

Byteflair

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

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

Actualizaciones & ConcurrenciaActualizaciones & Concurrencia

Byteflair

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

Si no son iguales, rechazar...

Actualizaciones & ConcurrenciaActualizaciones & Concurrencia

Byteflair

Podemos usar el ETAG

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

Peticiones asíncronasPeticiones asíncronas

Byteflair

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

Peticiones asíncronasPeticiones asíncronasScenario

Ok

NeedsRepair

Repaired

Awaiting

Byteflair

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

Peticiones asíncronasPeticiones asíncronasScenario

Ok

NeedsRepair

Repaired

Bajo mi controlAwaiting

Byteflair

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

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

Si existen peticiones que consumen mucho tiempo...

Byteflair

Peticiones asíncronasPeticiones asíncronas

Si existen peticiones que consumen mucho tiempo...

las hacemos asíncronas!

Byteflair

Peticiones asíncronasPeticiones asíncronas

Speaking in silverSpeaking in silveri18ni18n

Byteflair

Speaking in silverSpeaking in silveri18ni18n

GET /i18n/es_ESBody{

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

}

Byteflair

Byteflair

API API SpecificationSpecification

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Apiary.io

Primera versión: Abril 2013

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

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

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

Editor local:Atom + Snowcrash + Aglio + Atom plugin

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

Ejemplo

Byteflair

API API BlueprintBlueprintAPI API SpecificationSpecification

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

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

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

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

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.

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

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

Byteflair

SwaggerSwaggerAPI API SpecificationSpecification

Ejemplo

Byteflair

SwaggerSwaggerAPI API SpecificationSpecification

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

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.

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

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

Byteflair

RAMLRAMLAPI API SpecificationSpecification

Ejemplo

Byteflair

RAMLRAMLAPI API SpecificationSpecification

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

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

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

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Concisión

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Concisión

Herramientas

Byteflair

ComparativaComparativaAPI API SpecificationSpecification

Apiary Blueprint Swagger RAML +

Curva de aprendizaje

Mock server

Reutilización de código

Expresividad

Concisión

Herramientas

Documentación

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

Byteflair

API API SpecificationSpecificationConclusionesConclusiones

Byteflair

ToolsToolsDemoDemo

Byteflair

ToolsToolsLinksLinks

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

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

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

Byteflair

ToolsToolsGistsGists

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

“Las armas deben adaptarse a tus cualidades personales y

debes ser capaz de manejarlas” Miyamoto Mushashi

Byteflair

?ThanksThanks GraciasGracias

http://byteflair.com

Daniel Cerecedo@dcerecedo

Victor Hernandez@uvehachebe

top related