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.
Size: 6.72 MB
Language: es
Added: Mar 18, 2015
Slides: 84 pages
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
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
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