Byteflair
http://byteflair.com
Daniel Cerecedo
@dcerecedo
Victor Hernandez
@uvehachebe
AgendaAgenda
Arquitectura
ArquitecturaREST
DeveloperUX
RESTsobreHTTP
HypermediaAPIs
VistasAdaptativas
Actualizaciones&
Concurrencia
I18n
Lenguajesdeespecificación
Herramientasdeprueba
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 REST
Cliente/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 REST
SinestadoSinestado
Cliente
Elimina total o parcialmente algunas de las interacciones
 Rendimiento de red
 Rendimiento percibido por el usuario
Cache
Servidor
Cache
Byteflair
Arquitectura RESTArquitectura REST
CacheableCacheable
1.Identificación por URIs
2.Mensajes autodescriptivos
3.Manipulación a través de representaciones
4.HATEOAS
 Simplicidad
Byteflair
Arquitectura RESTArquitectura REST
InterfazuniformeInterfazuniforme
Cliente
Cada capa solo conoce a su vecina
 Simplicidad
 Latencia
Cache
Servidor
Cache
Proxy
Cache
Balanceador
Byteflair
Arquitectura RESTArquitectura REST
PorcapasPorcapas
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 HTTP
LudwigWittgenstein
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 Elclientehahechoalgomal→
5xx Elservidorhafallado→
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 problema
Identificalosrecursosdeldominio
Identificalastransicionesdeestadodelsistema
Distingueentreestructurainternayloqueexponescomorecurso
Byteflair
 ¡No expongas la base de datos!
HypermediaHypermedia
Recursos del dominio
Vehicles Drivers
Users Owners
Sessions
Transiciones de estado
Crearrecursos
Filtrarrecursos
Asignarconductoravehículo
Activarsesión:conductor+vehículo
Desactivarsesión
Byteflair
HypermediaHypermedia
Definir los formatos de representación
Mime Types
Definir roles para cada control hypermedia
Rel Types
Convenciones semánticas
POST, PUT, GET, DELETE
Byteflair
HypermediaHypermedia
GET /
Headers
Link:
<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 /vehicles
Headers
Link:
<https://api.domain.com/vehicles?page=1&size=20>;
rel=”next”
Body
[ {...}, {…}, ...] Control links
Byteflair
HypermediaHypermedia
GET /sessions/1374
Body
{ ….
“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/1
Body
{ ….
“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
Convenciones
RelTypes,MediaTypes,Methods,StatusCodes
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 servidor
con magia
Byteflair
Vistas adaptativasVistas adaptativas
Byteflair
Vistas adaptativasVistas adaptativas
Distintos contextos de seguridad
requieren vistas diferentes sobre los
mismos datos
Byteflair
Unadministradordebepodervertodoslosdatosdeun
usuario
Unusuariopuedevertodossusdatos
Unusuariosolopuedeverlosdatospúblicosdelos
demásusuarios
Scenario
Byteflair
Vistas adaptativasVistas adaptativas
/users/{id}
/owner/users/{id}
/admin/users/{id}
UnaURIporcadaroldeseguridad
Scenario
Byteflair
Vistas adaptativasVistas adaptativas
Descomponerelrecurso
Dardiferentesnivelesdeaccesoacadarecurso
Scenario
/users/{id}
/users/{id}/my-private-data
/users/{id}/data-about-me-only-the-admin-knows
Byteflair
Vistas adaptativasVistas adaptativas
Unúnicorecurso
Múltiplesvistassobreelmismorecurso
Seleccionamoslavistaenruntime
Scenario
/users/{id}
Byteflair
Vistas adaptativasVistas adaptativas
Actualizaciones & Concurrencia
Byteflair
Dosclientestratandeactualizarelmismorecursode
formaconcurrente
Larepresentacióneselestadodelaaplicación
Debemosevitarquelasegundapeticiónactualiceel
recursoapartirdeunarepresentaciónobsoleta
Actualizaciones & ConcurrenciaActualizaciones & Concurrencia
Scenario
Byteflair
Compararlarepresentaciónquellegaconelrecurso
existente...
Actualizaciones & ConcurrenciaActualizaciones & Concurrencia
Byteflair
Compararlarepresentaciónquellegaconelrecurso
existente...
Sinosoniguales,rechazar...
Actualizaciones & ConcurrenciaActualizaciones & Concurrencia
Byteflair
Podemos usar el ETAG
Compararlarepresentaciónquellegaconelrecurso
existente...
Sinosoniguales,rechazar...
Siesposible,informaralclientedelasviolaciones
Actualizaciones & ConcurrenciaActualizaciones & Concurrencia
Byteflair
Peticiones asíncronasPeticiones asíncronas
Byteflair
Comoidentificamospeticionesintrínsecamente
asíncronas?
Existentransicionesdeestadofueradelcontroldel
cliente
Notienesentidodevolverunarepresentaciónporqueno
conocemoselestadodelrecursotraslallamada
Byteflair
Peticiones asíncronasPeticiones asíncronas
Peticiones asíncronasPeticiones asíncronas
Scenario
Ok
Needs
Repair
Repaired
Awaiting
Byteflair
Loscamionesserevisanregularmenteyseseleccionan
parareparación
Peticiones asíncronasPeticiones asíncronas
Scenario
Ok
Needs
Repair
Repaired
Bajo mi control
Awaiting
Byteflair
Loscamionesserevisanregularmenteyseseleccionan
parareparación
Peticiones asíncronasPeticiones asíncronas
Scenario
Ok
Needs
Repair
Repaired
Bajo mi control
Awaiting
PUT/trucks/6/repair
202Accepted
Byteflair
Loscamionesserevisanregularmenteyseseleccionan
parareparación
Siexistenpeticionesqueconsumenmuchotiempo...
Byteflair
Peticiones asíncronasPeticiones asíncronas
Siexistenpeticionesqueconsumenmuchotiempo...
lashacemosasíncronas!
Byteflair
Peticiones asíncronasPeticiones asíncronas
SpeakinginsilverSpeakinginsilver
i18ni18n
Byteflair
SpeakinginsilverSpeakinginsilver
i18ni18n
GET /i18n/es_ES
Body
{
“country” : “ES”,
“lang”: “es”,
“data” : { “key”: “localized message”, ….}
}
Byteflair
Byteflair
APIAPI SpecificationSpecification
Byteflair
APIAPI BlueprintBlueprint
APIAPI SpecificationSpecification
Apiary.io
Primera versión: Abril 2013

Objetivos:

Simplicidad

Interacción y dialogo entre desarrolladores y consumidores
Byteflair
APIAPI BlueprintBlueprint
APIAPI SpecificationSpecification
Apiary editor:
https://app.apiary.io
Editor local:
Atom + Snowcrash + Aglio + Atom plugin
Byteflair
APIAPI BlueprintBlueprint
APIAPI SpecificationSpecification
Ejemplo
Byteflair
APIAPI BlueprintBlueprint
APIAPI SpecificationSpecification
Gist : https://gist.github.com/victorhernandezbermejo/9d5a9448a487a71dd503
Blueprint: http://docs.bfphonebook.apiary.io/
Byteflair
APIAPI BlueprintBlueprint
APIAPI 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
APIAPI BlueprintBlueprint
APIAPI 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
SwaggerSwagger
APIAPI 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
SwaggerSwagger
APIAPI 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
SwaggerSwagger
APIAPI 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
SwaggerSwagger
APIAPI SpecificationSpecification
Ejemplo
Byteflair
SwaggerSwagger
APIAPI SpecificationSpecification
Gist : https://gist.github.com/victorhernandezbermejo/efd8093ec45db46836cf
Byteflair
RAMLRAML
APIAPI 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
RAMLRAML
APIAPI 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-editor
docker run -d -p <port>:9013 byteflair/raml-editor
Byteflair
RAMLRAML
APIAPI 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
RAMLRAML
APIAPI SpecificationSpecification
Ejemplo
Byteflair
RAMLRAML
APIAPI SpecificationSpecification
Gist : https://gist.github.com/victorhernandezbermejo/f5db381cb4cf395f47d1
Byteflair
ComparativaComparativa
APIAPI 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
ComparativaComparativa
APIAPI 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
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Byteflair
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Curva de aprendizaje               
Byteflair
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Curva de aprendizaje               
Mock server               
Byteflair
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Curva de aprendizaje               
Mock server               
Reutilización de código               
Byteflair
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Curva de aprendizaje               
Mock server               
Reutilización de código               
Expresividad               
Byteflair
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Curva de aprendizaje               
Mock server               
Reutilización de código               
Expresividad               
Concisión               
Byteflair
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Curva de aprendizaje               
Mock server               
Reutilización de código               
Expresividad               
Concisión               
Herramientas               
Byteflair
ComparativaComparativa
APIAPI SpecificationSpecification
Apiary Blueprint Swagger RAML
 +               
Curva de aprendizaje               
Mock server               
Reutilización de código               
Expresividad               
Concisión               
Herramientas               
Documentación               
Byteflair
ComparativaComparativa
APIAPI 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
APIAPI SpecificationSpecification
ConclusionesConclusiones
Byteflair
ToolsTools
DemoDemo
Byteflair
ToolsTools
LinksLinks
Postman: http://www.getpostman.com/
Runscope: https://www.runscope.com/
Soap UI: http://www.soapui.org/
Byteflair
ToolsTools
GistsGists
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

Todo sobre mis APIs