SlideShare a Scribd company logo
1 of 84
Download to read offline
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

More Related Content

What's hot

Java day 2018 -> Integración y entrega continua no es más trabajo
Java day 2018 ->  Integración y entrega continua no es más trabajoJava day 2018 ->  Integración y entrega continua no es más trabajo
Java day 2018 -> Integración y entrega continua no es más trabajoDavid Recinos Orellana
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJCMicael Gallego
 
Bdd (Behavior Driven Development)
Bdd (Behavior Driven Development)Bdd (Behavior Driven Development)
Bdd (Behavior Driven Development)Helder De Oliveira
 
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)Micael Gallego
 
Micro vs Nano (servicios)
Micro vs Nano (servicios)Micro vs Nano (servicios)
Micro vs Nano (servicios)Pedro J. Molina
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveEduard Tomàs
 
Catalyst: Framework para el desarrollo de aplicaciones Web
Catalyst: Framework para el desarrollo de aplicaciones WebCatalyst: Framework para el desarrollo de aplicaciones Web
Catalyst: Framework para el desarrollo de aplicaciones WebEsteban Saavedra
 
NetRaf 2017 - La plataforma .NET en el 2017
NetRaf 2017 - La plataforma .NET en el 2017NetRaf 2017 - La plataforma .NET en el 2017
NetRaf 2017 - La plataforma .NET en el 2017Diego Bersano
 
Zend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, ColombiaZend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, Colombiarazigal
 
Desarrollo web front-end con TypeScript, Angular 2 e Ionic
Desarrollo web front-end con TypeScript, Angular 2 e IonicDesarrollo web front-end con TypeScript, Angular 2 e Ionic
Desarrollo web front-end con TypeScript, Angular 2 e IonicMicael Gallego
 
Mirando a Alfresco desde Minecraft
Mirando a Alfresco desde MinecraftMirando a Alfresco desde Minecraft
Mirando a Alfresco desde MinecraftAngel Borroy López
 
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...Micael Gallego
 
Azure Bootcamp 2017 - Azure functions
Azure Bootcamp 2017 - Azure functionsAzure Bootcamp 2017 - Azure functions
Azure Bootcamp 2017 - Azure functionsDiego Bersano
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7Luis Ruiz Pavón
 

What's hot (20)

Java day 2018 -> Integración y entrega continua no es más trabajo
Java day 2018 ->  Integración y entrega continua no es más trabajoJava day 2018 ->  Integración y entrega continua no es más trabajo
Java day 2018 -> Integración y entrega continua no es más trabajo
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJC
 
Bdd (Behavior Driven Development)
Bdd (Behavior Driven Development)Bdd (Behavior Driven Development)
Bdd (Behavior Driven Development)
 
Implementando una Arquitectura de Microservicios
Implementando una Arquitectura de MicroserviciosImplementando una Arquitectura de Microservicios
Implementando una Arquitectura de Microservicios
 
Maven
MavenMaven
Maven
 
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
 
Micro vs Nano (servicios)
Micro vs Nano (servicios)Micro vs Nano (servicios)
Micro vs Nano (servicios)
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep Dive
 
Framework Catalyst
Framework CatalystFramework Catalyst
Framework Catalyst
 
Catalyst: Framework para el desarrollo de aplicaciones Web
Catalyst: Framework para el desarrollo de aplicaciones WebCatalyst: Framework para el desarrollo de aplicaciones Web
Catalyst: Framework para el desarrollo de aplicaciones Web
 
NetRaf 2017 - La plataforma .NET en el 2017
NetRaf 2017 - La plataforma .NET en el 2017NetRaf 2017 - La plataforma .NET en el 2017
NetRaf 2017 - La plataforma .NET en el 2017
 
ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3
 
Zend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, ColombiaZend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, Colombia
 
Springboot Overview
Springboot  OverviewSpringboot  Overview
Springboot Overview
 
Desarrollo web front-end con TypeScript, Angular 2 e Ionic
Desarrollo web front-end con TypeScript, Angular 2 e IonicDesarrollo web front-end con TypeScript, Angular 2 e Ionic
Desarrollo web front-end con TypeScript, Angular 2 e Ionic
 
Mirando a Alfresco desde Minecraft
Mirando a Alfresco desde MinecraftMirando a Alfresco desde Minecraft
Mirando a Alfresco desde Minecraft
 
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
Concurrencia y asincronía: Lenguajes, modelos y rendimiento: GDG Toledo Enero...
 
Azure Bootcamp 2017 - Azure functions
Azure Bootcamp 2017 - Azure functionsAzure Bootcamp 2017 - Azure functions
Azure Bootcamp 2017 - Azure functions
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
 
Deploying Wordpress
Deploying WordpressDeploying Wordpress
Deploying Wordpress
 

Similar to Todo sobre mis APIs

Similar to Todo sobre mis APIs (20)

ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
API Centric
API CentricAPI Centric
API Centric
 
Cliente Servidor
Cliente ServidorCliente Servidor
Cliente Servidor
 
Portales y portlets web
Portales y portlets webPortales y portlets web
Portales y portlets web
 
Curso richfaces 3.3.3 II
Curso richfaces 3.3.3 IICurso richfaces 3.3.3 II
Curso richfaces 3.3.3 II
 
RESUMEN PROXY
RESUMEN PROXYRESUMEN PROXY
RESUMEN PROXY
 
servidor proxy
servidor proxyservidor proxy
servidor proxy
 
Resumen Servidor Proxy
Resumen Servidor ProxyResumen Servidor Proxy
Resumen Servidor Proxy
 
Presentación de Lyracons en el Meet Magento Argentina 2017
Presentación de Lyracons en el Meet Magento Argentina 2017 Presentación de Lyracons en el Meet Magento Argentina 2017
Presentación de Lyracons en el Meet Magento Argentina 2017
 
Patrones Arquitecturales Para Aplicaciones Web
Patrones Arquitecturales Para Aplicaciones WebPatrones Arquitecturales Para Aplicaciones Web
Patrones Arquitecturales Para Aplicaciones Web
 
Resumen squid
Resumen squidResumen squid
Resumen squid
 
Tema 1
Tema 1Tema 1
Tema 1
 
Desarrollo web
Desarrollo webDesarrollo web
Desarrollo web
 
Capitulo 2 servidores
Capitulo 2   servidoresCapitulo 2   servidores
Capitulo 2 servidores
 
Capitulo 2 servidores
Capitulo 2   servidoresCapitulo 2   servidores
Capitulo 2 servidores
 
Capitulo 2 servidores
Capitulo 2   servidoresCapitulo 2   servidores
Capitulo 2 servidores
 
Capitulo 2 servidores
Capitulo 2   servidoresCapitulo 2   servidores
Capitulo 2 servidores
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
 
El servicio http
El servicio httpEl servicio http
El servicio http
 
Webinar Gratuito "OWASP WebScarab"
Webinar Gratuito "OWASP WebScarab"Webinar Gratuito "OWASP WebScarab"
Webinar Gratuito "OWASP WebScarab"
 

More from Daniel Cerecedo

From Legacy to the Cloud and Beyond
From Legacy to the Cloud and BeyondFrom Legacy to the Cloud and Beyond
From Legacy to the Cloud and BeyondDaniel Cerecedo
 
Drone Continuous Integration
Drone Continuous IntegrationDrone Continuous Integration
Drone Continuous IntegrationDaniel Cerecedo
 
Introducción a Story Mapping & más
Introducción a Story Mapping & másIntroducción a Story Mapping & más
Introducción a Story Mapping & másDaniel Cerecedo
 
IT para Product Managers
IT para Product ManagersIT para Product Managers
IT para Product ManagersDaniel Cerecedo
 
Battelfield REST, API Development from the trenches
Battelfield REST, API Development from the trenchesBattelfield REST, API Development from the trenches
Battelfield REST, API Development from the trenchesDaniel Cerecedo
 

More from Daniel Cerecedo (7)

From Legacy to the Cloud and Beyond
From Legacy to the Cloud and BeyondFrom Legacy to the Cloud and Beyond
From Legacy to the Cloud and Beyond
 
Drone Continuous Integration
Drone Continuous IntegrationDrone Continuous Integration
Drone Continuous Integration
 
Introducción a Story Mapping & más
Introducción a Story Mapping & másIntroducción a Story Mapping & más
Introducción a Story Mapping & más
 
API Centric Patterns
API Centric PatternsAPI Centric Patterns
API Centric Patterns
 
Skyrocketing Web APIs
Skyrocketing Web APIsSkyrocketing Web APIs
Skyrocketing Web APIs
 
IT para Product Managers
IT para Product ManagersIT para Product Managers
IT para Product Managers
 
Battelfield REST, API Development from the trenches
Battelfield REST, API Development from the trenchesBattelfield REST, API Development from the trenches
Battelfield REST, API Development from the trenches
 

Todo sobre mis APIs