Todo sobre mis APIs

DanielCerecedo 2,174 views 84 slides Mar 18, 2015
Slide 1
Slide 1 of 84
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84

About This Presentation

En esta ocasión presentamos estrategias de desarrollo de APIs REST, así como los distintas herramientas y lenguajes de especificación que nos van a permitir generar código y documentación. También repasamos herramientas de testing para APIs.


Slide Content

Byteflair
http://byteflair.com
Daniel Cerecedo
@dcerecedo
Victor Hernandez
@uvehachebe

AgendaAgenda
Arquitectura
Arquitectura REST
Developer UX
REST sobre HTTP
Hypermedia APIs
Vistas Adaptativas
Actualizaciones &
Concurrencia
I18n
Lenguajes de especificación
Herramientas 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 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
Sin 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 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
Interfaz uniformeInterfaz uniforme

Cliente
Cada capa solo conoce a su vecina
 Simplicidad
 Latencia
Cache
Servidor
Cache
Proxy
Cache
Balanceador
Byteflair
Arquitectura RESTArquitectura REST
Por 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 HTTP
Ludwig 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 problema
Identifica los recursos del dominio
Identifica las transiciones de estado del sistema
Distingue entre estructura interna y lo que expones como recurso
Byteflair
 ¡No expongas la base de datos!

HypermediaHypermedia
Recursos del dominio
VehiclesDrivers
UsersOwners
Sessions
Transiciones de estado
Crear recursos
Filtrar recursos
Asignar conductor a vehículo
Activar sesión: conductor + vehículo
Desactivar sesió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
Rel 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 servidor
con 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 datos
Un 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 recurso
Dar 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 recurso
Mú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 & Concurrencia
Scenario
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íncronas
Scenario
Ok
Needs
Repair
Repaired
Awaiting
Byteflair
Los camiones se revisan regularmente y se seleccionan
para reparación

Peticiones asíncronasPeticiones asíncronas
Scenario
Ok
Needs
Repair
Repaired
Bajo mi control
Awaiting
Byteflair
Los camiones se revisan regularmente y se seleccionan
para reparación

Peticiones asíncronasPeticiones asíncronas
Scenario
Ok
Needs
Repair
Repaired
Bajo mi control
Awaiting
PUT /trucks/6/repair
202 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 silver
i18ni18n
Byteflair

Speaking in silverSpeaking in silver
i18ni18n
GET /i18n/es_ES
Body
{
“country” : “ES”,
“lang”: “es”,
“data” : { “key”: “localized message”, ….}
}
Byteflair

Byteflair
API API SpecificationSpecification

Byteflair
API API BlueprintBlueprint
API API SpecificationSpecification
Apiary.io
Primera versión: Abril 2013
Objetivos:
Simplicidad
Interacción y dialogo entre desarrolladores y consumidores

Byteflair
API API BlueprintBlueprint
API API SpecificationSpecification
Apiary editor:
https://app.apiary.io
Editor local:
Atom + Snowcrash + Aglio + Atom plugin

Byteflair
API API BlueprintBlueprint
API API SpecificationSpecification
Ejemplo

Byteflair
API API BlueprintBlueprint
API API SpecificationSpecification
Gist  : https://gist.github.com/victorhernandezbermejo/9d5a9448a487a71dd503
Blueprint: http://docs.bfphonebook.apiary.io/

Byteflair
API API BlueprintBlueprint
API 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 BlueprintBlueprint
API 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
SwaggerSwagger
API 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
SwaggerSwagger
API 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
SwaggerSwagger
API 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
SwaggerSwagger
API API SpecificationSpecification
Ejemplo

Byteflair
SwaggerSwagger
API API SpecificationSpecification
Gist  : https://gist.github.com/victorhernandezbermejo/efd8093ec45db46836cf

Byteflair
RAMLRAML
API 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
RAMLRAML
API 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-editor
docker run -d -p <port>:9013 byteflair/raml-editor

Byteflair
RAMLRAML
API 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
RAMLRAML
API API SpecificationSpecification
Ejemplo

Byteflair
RAMLRAML
API API SpecificationSpecification
Gist  : https://gist.github.com/victorhernandezbermejo/f5db381cb4cf395f47d1

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Comunidad de usuarios 
+
 Watch Star Fork Questions
Apiary Blueprint115 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
API API SpecificationSpecification
Comunidad de usuarios 
+
 Watch Star Fork Questions
Apiary Blueprint115 1,891 561 489     
Swagger 221 2,482 822 1,541     
RAML 96 1,080 77 120     

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              
Mock server               

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              
Mock server               
Reutilización de código              

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              
Mock server               
Reutilización de código              
Expresividad               

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              
Mock server               
Reutilización de código              
Expresividad               
Concisión               

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              
Mock server               
Reutilización de código              
Expresividad               
Concisión               
Herramientas               

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              
Mock server               
Reutilización de código              
Expresividad               
Concisión               
Herramientas               
Documentación               

Byteflair
ComparativaComparativa
API API SpecificationSpecification
Apiary BlueprintSwagger RAML
 
+
              
Curva de aprendizaje              
Mock server               
Reutilización de código              
Expresividad               
Concisión               
Herramientas               
Documentación               
Total 27  27  35 

Byteflair
API API 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