SlideShare una empresa de Scribd logo
1 de 74
Servicios Web
REST
Breve introducción a REST
Contenido de la charla
• Qué es REST?
o
o
o
o
o

Definición
Conceptos
Verbos HTTP
Códigos de respuesta
Ejemplos

• APIs CRUD
o Operaciones sobre recursos
o Problemas de concurrencia
o Operaciones asíncronas

• Seguridad en REST
• Testing y pruebas
Sobre mi
• Programador web PHP
desde hace 4 años
(aprox. 1 con
Symfony2).
• Muy fan de
NodeJS, Angular y
Javascript en general
• Aficionado a la
seguridad informática y
redes.
Qué es REST?
Definición y conceptos
Qué es REST?
 Es una tecnología?
Qué es REST?
 Es una tecnología? ✗

 Es una arquitectura?
Qué es REST?
 Es una tecnología? ✗

 Es una arquitectura? ✗
 Es un “estilo arquitectónico”?
Qué es REST?
 Es una tecnología? ✗

 Es una arquitectura? ✗
 Es un “estilo arquitectónico”? ✓
Cuando hablamos de REST nos referimos a una forma
de implementar una arquitectura en concreto
(arquitectura WebService) por eso solemos decir que
REST es sólo un estilo de elaborar servicios web.
Qué significa REST?

REpresentational
State
Transfer
¿Qué es REST?
• La primera vez que se habló de REST fue en el año
2000 en la tesis doctoral de Roy Fielding, uno de los
principales autores del protocolo HTTP
• Está orientado a transferencias de recursos, no a
llamadas de procedimientos remotos (RPC)
• Hace un uso muy eficiente del protocolo
HTTP, rompe con el esquema de la web que
funciona solo con GET y POST
REST en la actualidad
• A día de hoy se conoce por REST a casi cualquier
servicio Web que trabaje con XML y HTTP
• La mayor parte de las APIs existentes son simples
interfaces para interactuar con la base de datos
(CRUD básico)
• REST nos permite modelar totalmente nuestro
negocio sin importar el lenguaje en que este
implementado el servicio o el cliente
Conceptos y reglas
• El servicio representará recursos, no acciones
o No se publican verbos como “comprar”
o Se usan recursos como “pedido” o “compra”

• Todos los recursos deben de poseer un UUID
o Universal Unique Identifier
o Todo recurso en REST necesita un UUID para ser identificado dentro del
sistema

• La forma en que se represente internamente un
recurso debe ser privada

• Todos los recursos deben de poseer un interfaz de
operaciones, y todos deben de implementarlas.
Cómo funciona?
• Las operaciones se realizan por transferencia de
estado
o El cliente pide una copia del recurso al servicio
o El cliente modifica el recurso
o El cliente transfiere el recurso actualizado al servicio

• Los recursos deben ser multimedia
o Los recursos deben de poder expresarse en más de un formato
• JSON, XML, CSV…
o En las peticiones podemos y debemos indicar el tipo de formato que
admitimos, o una lista con varios, ordenada por prioridades.

• Según la implementación que se consiga, un API se
cataloga en uno de los niveles REST
Verbos HTTP
• El protocolo HTTP define un conjunto de verbos que nos
permiten realizar todo tipo de operaciones:
o
o
o
o
o
o

GET (LEER)
PUT (CREAR O ACTUALIZAR RECURSO COMPLETO)
POST (CREAR, ACTUALIZAR PARCIALMENTE UN RECURSO)
PATCH (ACTUALIZAR PARCIALMENTE UN RECURSO)
DELETE (BORRAR)
OPTIONS (CONSULTAR OPERACIONES)

• http://www.restapitutorial.com/lessons/httpmethods.html
• Usarlos incorrectamente lleva a desastres como el de
Basecamp.
o

http://www.mail-archive.com/isn@attrition.org/msg04213.html
POST e idempotencia
• POST es él verbo “maldito” por REST, al no ser
idempotente.
• La idempotencia asegura que ejecutar n veces
una transferencia obtendrá el mismo resultado.
• Se usa para modelar operaciones como:
o Crear recursos
o Modificar parcialmente recursos…
Códigos de Respuesta
•

El resultado de una transferencia REST viene dado por el código de
estado de la respuesta HTTP, en REST, los más habituales son:
o
o
o
o
o
o
o
o
o
o
o
o

•

200 (OK)
201 (Creado)
202 (Aceptado)
204 (Sin contenido)
304 (No modificado)
400 (Petición mal formada)
401 (No autorizado)
403 (Acceso no permitido)
404 (No encontrado)
409 (Conflicto)
412 (Fallo de pre-condición)
500 (Problema de Servidor)

http://www.restapitutorial.com/httpstatuscodes.html
VEAMOS EJEMPLOS!
Ejemplos
En nuestra API de pruebas usaremos:
•

GET
o
o

•

Eliminar recursos

o

•

Actualizaciones totales de recursos

o

•

Actualizaciones parciales

o

•

Creación de recursos

o

•

Obtener recursos o colecciones de recursos

Consultar acciones disponibles

POST

PATCH
PUT

DELETE

OPTIONS

La URL sobre la que trabajaremos será:
http://symfonyvalencia.es/api/usuarios
El servidor puede devolver datos en XML o en JSON
Transferencia OPTIONS
Consultar acciones

Cliente
OPTIONS /api/usuarios/B2K1E3
Host: www.symfonyvalencia.es

Servidor
HTTP/1.1 200 OK
Allow:
GET, PUT, POST, OPTIONS, DELETE, PATC
H
Transferencia GET
Obtener una Colección

Cliente
GET /api/usuarios HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor
Transferencia GET
Obtener una Colección

Cliente
GET /api/usuarios HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor
HTTP/1.1 200 OK
Content-Type: application/json
[{
“id”: “X1B4Z3”,
“nombre”: “Miguel Ángel”,
“edad”: 27,
“lenguajes”: [“PHP”, “Javascript”]
},
{
“id”: “AB325J”,
“nombre”: “Ángel Miguel”,
“edad”: 26,
“lenguajes”: [“Ruby”, “Java”]
}]
Transferencia GET
Obtener un registro

Cliente
GET /api/usuarios/X1B4Z3 HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor
Transferencia GET
Obtener un registro

Cliente
GET /api/usuarios/X1B4Z3 HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor
HTTP/1.1 200 OK
Content-Type: application/json
Etag: W/2cc7-3f3ba34cc25d
{
“id”: “X1B4Z3”,
“nombre”: “Miguel Ángel”,
“edad”: 27,
“lenguajes”: [“PHP”, “Javascript”]
}
Transferencia POST
Crear un recurso

Cliente
POST /api/usuarios HTTP/1.1
Host: www.symfonyvalencia.es
Content-Type: application/x-wwwform-urlencoded
Accept: application/json
nombre=Manolo&edad=26&localidad
=Valencia

Servidor
Transferencia POST
Crear un recurso

Cliente
POST /api/usuarios HTTP/1.1
Host: www.symfonyvalencia.es
Content-Type: application/x-wwwform-urlencoded
Accept: application/json
nombre=Manolo&edad=26&localidad
=Valencia

Servidor
HTTP/1.1 201 Created
Content-Type: application/json
Location:
http://symfonyvalencia.es/usuarios/B2
K1E3
Etag: W/2cc7-3f3ba34cc25d
{
”id”: “B2K1E3”
}
Transferencia PUT
Actualizar un recurso

Cliente
PUT /api/usuarios/X1B4Z3
Host: www.symfonyvalencia.es
Content-Type: application/json
Accept: application/json
{

“nombre”: “Miguel Ángel”,
“edad”: 27,
“lenguajes”: [„PHP‟, „Javascript‟],
“localidad”: “Valencia”
}

Servidor
Transferencia PUT
Actualizar un recurso

Cliente
PUT /api/usuarios/X1B4Z3
Host: www.symfonyvalencia.es
Content-Type: application/json
Accept: application/json
{

“nombre”: “Miguel Ángel”,
“edad”: 27,
“lenguajes”: [„PHP‟, „Javascript‟],
“localidad”: “Valencia”
}

Servidor
HTTP/1.1 204 No Content
Content-Type: application/json
Etag: W/2cc7-3f3ba34cc25d
Transferencia DELETE
Eliminar un recurso

Cliente
DELETE /api/usuarios/B2K1E3
Host: www.symfonyvalencia.es

Servidor
HTTP/1.1 204 No Content
API’S CRUD
Las API‟s CRUD son el tipo de API más extendido en el mundo
REST
APIs CRUD
• Son las APIs más habituales
• CRUD
o
o
o
o

Create (crear)
Read (leer)
Update (actualizar)
Delete (borrar)

• Cubren las operaciones básicas que realizamos
habitualmente sobre entidades
• Implementan todos los verbos HTTP
• Son lo contrario a APIs read-only
• Son bastante sencillas de implementar
• En Symfony2 existen bundles que facilitan su
implementación, como FOSRESTBundle
APIs CRUD
• Si pretendemos ceñirnos absolutamente al
concepto de API REST, no debemos de diseñar
nuestra API como un reflejo de las entidades, ya
que expone nuestro esquema de base de datos.

• Un cambio en una entidad no debería de afectar
al uso del API.
• Se trata de modelar nuestro negocio con
operaciones sobre recursos no de crear un interfaz
para gestionar nuestra base de datos.
Acceso concurrente
• Si a nuestro Web Service se conectan
simultáneamente varias personas y modifican el
mismo registro… ¿Puede haber problemas de
inconsistencia?

• El problema de la inconsistencia en REST se
soluciona habitualmente con la inclusión de
cabeceras Etag y If-Match.
• Se utilizan Etags débiles, ya que las fuertes son
demasiado estrictas para nuestro propósito
Ejemplo 1/3
Cliente
GET /api/usuarios/X1B4Z3 HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor
HTTP/1.1 200 OK
Content-Type:
application/json;charset=utf-8
Etag: W/689438a788bbc2e
{
“id”: “X1B4Z3”,
“nombre”: “Miguel Ángel”,
“edad”: 27,
“lenguajes”: [“PHP”, “Javascript”]
}
Ejemplo 2/3
Cliente
PUT /api/usuarios/X1B4Z3 HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json
If-Match: W/689438a788bbc2e
Content-Type: application/json

{
“id”: “X1B4Z3”,
“nombre”: “Miguel Ángel Sánchez”,
“edad”: 23,
“lenguajes”: [“PHP”, “Javascript”],
“localidad”: “Valencia”
}

Servidor (Match OK)
HTTP/1.1 204 No Content
Etag: W/91246ef669ab7
Ejemplo 3/3
Cliente
PUT /api/usuarios/X1B4Z3 HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json
If-Match: W/689438a788bbc2e
Content-Type: application/json

{
“id”: “X1B4Z3”,
“nombre”: “Miguel Ángel Sánchez”,
“edad”: 23,
“lenguajes”: [“PHP”, “Javascript”],
“localidad”: “Valencia”
}

Servidor (Match KO)
HTTP/1.1 412 Precondition Failed
Etag: W/91246ef669ab7
Actualizaciones parciales
• Otro problema básico en REST es la actualización
parcial del contenido.
• Si usamos PUT, sobrescribimos todo el recurso, ¿y si solo
queremos cambiar un atributo del recurso?
• El método habitual se basa en crear nuevos tipos MIME
de cambio de estado o diff y usar POST.
• La solución moderna pasa por usar el verbo
PATCH, funciona igual que con POST, pero es más
semántico y solo admite tipos MIME que representen
diffs
Actualizaciones parciales
• Cuando hablamos de diffs hablamos de crear un
formato o tipo MIME que represente una operación
de actualización parcial sobre un registro.
• Suelen nombrarse como:
o

application/recurso-diff+formato

• Recurso es el tipo de entidad (usuario, factura…)
• Formato puede ser cualquier formato (json, xml…)
• Ejemplos:
o application/usuario-diff+json
o application/usuario-diff+xml
Ejemplo de actualización
PATCH /api/usuarios/X1B4Z3 HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json
If-Match: W/979c576c5be5fa5
Content-Type: application/usuario-diff+json
[{

},
{

}]

“tipo-cambio”: “sustituir”,
“campo”: “edad”,
“valor”: “23”
“tipo-cambio”: “anadir”,
“campo”: “localidad”,
“valor”: “Valencia”
Operaciones de larga
duración o asíncronas
Operaciones de larga
duración o asíncronas
Cuando las operaciones no son inmediatas, o deben
ser encoladas porque se procesan en bloque a cierta
hora mediante un cron, o necesitan validación de un
servicio externo (pasarelas de pago, Paypal…), el
usuario debe de poder seguir el estado del recurso.
Con REST es posible modelar operaciones asíncronas
o encolables creando un recurso intermedio que
represente el estado del recurso antes de finalizar su
creación.
Ejemplo
• Vamos a realizar un pago a una tienda online vía
REST
• El pago debe de ser validado por la entidad
bancaria que implementa la pasarela de pago.
• El proceso puede tardar entre 3 y 5min
• El cliente desea saber cuando ha sido validado el
pago
Ejemplo 1/4
Cliente
POST /api/pago HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json
Content-Type: application/json

Servidor
HTTP/1.1 202 Accepted
Location: /api/cola-pago/XBC3719
{
“location”: “/api/cola-pago/XBC3719”,
“estado”: “pendiente”

{

“metodo”: “visa”,
“numtarjeta”: 1234567812345678,
“cvv”: 123
“caducidad”: “12/17”
“cantidad”: 2500
}

}
Ejemplo 2/4
Cliente
GET /api/cola-pago/XBC3719
HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor
HTTP/1.1 200 OK
Content-Type: application/json
{
“estado”: “pendiente”
}
Ejemplo 3/4
Cliente
GET /api/cola-pago/XBC3719
HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor (Pago OK)
HTTP/1.1 200 OK
Content-Type: application/json
{
“estado”: “ok”,
“id”: “/api/pago/DEB743AC”

}
Ejemplo 3 bis/4
Cliente
GET /api/pago/DEB743AC HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor (Pago OK)
HTTP/1.1 200 OK
Content-Type: application/json
{
“metodo”: “visa”,
“numtarjeta”: 1234567812345678,
“cvv”: 123
“caducidad”: “12/17”
“cantidad”: 2500
“estado”: “pagado”
}
Ejemplo 4/4
Cliente
GET /api/cola-pago/XBC3719
HTTP/1.1
Host: www.symfonyvalencia.es
Accept: application/json

Servidor (Error de pago)
HTTP/1.1 200 OK
Content-Type: application/json
{
“estado”: “error”,
“error”: “sin fondos

}
Seguridad en REST
No todas las API‟s son públicas
Seguridad en REST
• En el contexto de un servicio REST no existe el concepto
de Sesión, ya que HTTP es un protocolo Stateless no
orientado a conexión.
• Si nuestra API necesita autenticar a sus usuarios, estos
deben de hacerlo en cada petición
• Esto simplifica un ataque por parte de intrusos
• Veamos algunas normas básicas de seguridad en REST
1. No uses IDs predecibles
1. No uses IDs predecibles
• Cualquier intruso que sniffe nuestro tráfico y
detecte una petición del tipo:
GET /api/usuario/1/datos-bancarios
• Se verá tentado de probar con:
GET /api/usuario/2/datos-bancarios
GET /api/usuario/3/datos-bancarios
GET /api/usuario/n/datos-bancarios
• Tampoco debemos usar las claves primarias de
nuestra base de datos, nos exponemos a ataques
SQLi
2. Usa HTTPS
2. Usa HTTPS
• Con el protocolo HTTPS ya tenemos ganado la
mitad
• Es un protocolo seguro y el contenido va
cifrado, tanto para peticiones como para
respuestas.
• Si transmitimos información sensible no será
fácilmente reproducible por un atacante que haya
usado un sniffer
• Nos da seguridad a la hora de transmitir
contraseñas
3. Genera Tokens de
seguridad
3. Genera Tokens de
seguridad
• Si creamos nuestro propio esquema de
seguridad, generando Tokens que caduquen cada
cierto tiempo, evitaremos transmitir la contraseña
demasiadas veces.
• Después de la primera autenticación, el servidor
nos transmite nuestro Token

• En las próximas peticiones lo incorporaremos en
una cabecera, o una cookie
4. Usa criptografía
hardcore
4. Algoritmo HMAC
• Nos puede ayudar a construir buenos Tokens
PARTE_PUBLICA = UUID + “:” + NIVEL_SEGURIDAD + ”:”
+ TIMESTAMP
FIRMA = HMAC(CLAVE_SECRETA, PARTE_PUBLICA)
TOKEN = FIRMA + ”_” + PARTE_PUBLICA
• Desde el servidor basta con descomponer el Token
en las componentes FIRMA y PARTE_PUBLICA, volver
a calcular la firma con la PARTE_PUBLICA recibida y
comparar la firma generada con la recibida
4. Algoritmos ajustables
• Algoritmos como BCRYPT o PBKDF aceptan un
parámetro de “complejidad”, que permiten indicar
cuanto tardará en calcularse la contraseña.
• Esto limita los ataques de fuerza bruta, por
ejemplo, con una complejidad de 500ms solo
podrían probarse 2 passwords por segundo.
5. Usa OAuth
5. Usa OAuth
• Una opción alternativa a generar nuestros tokens es
implementar un servidor OAuth que nos permita
acceder a nuestra API
• Existen librerías en casi todos los lenguajes que
implementan OAuth
• Podemos incluso usar nuestros credenciales en
redes sociales para acceder a nuestra API.
Testing y pruebas
Asegurándonos de que todo anda bien
Testing y pruebas
Testing y pruebas
• Como cualquier otro programa, aplicación web… que
desarrollemos, las APIs REST se pueden implementar
usando TDD.
• Es importante testear siempre que todos los códigos de
respuesta devueltos son adecuados, tanto para casos
de éxito como para casos de error.
• IMPORTANTE: Muchos frameworks implementan listeners
de excepciones y evitan, por ejemplo que una página
devuelva un 404, enmascarando el resultado con una
respuesta 200.
Testing con xUnit
• Podemos usar tranquilamente nuestro framework
de pruebas xUnit para testear, no solo los códigos
de respuesta, sino toda la lógica de negocio.
• Las prácticas habituales de testing con este tipo de
herramientas son totalmente válidas para el testeo.
Testing con cURL
Testing con cURL
• Es una alternativa para realizar nuestros tests (cURL
+ Shell Script)
• Con cURL podemos crear exactamente la
transferencia que buscamos.
• Si se tienen suficientes conocimientos sobre cURL se
pueden crear buenos tests con un tiempo de
ejecución bastante bajo.
Testing con Guzzle

… porque cURL no es para todos los públicos
Testing con Guzzle (PHP)
• Guzzle es una librería en PHP que actúa como un
wrapper de cURL, exprimiendo al máximo su
potencia.
• Permite crear clientes REST muy potentes y
escalables
• Es realmente sencillo de utilizar y es orientado a
objetos

• Se integra bien con PHPUnit.
Testing con POSTMAN
Testing con POSTMAN
• POSTMAN es un plugin para Chrome que actúa
como cliente REST
• Nos permite guardar las transferencias
preconfiguradas
• Permite autenticación mediante OAuth de forma
bastante sencilla
• No es una herramienta automática (hay que
ejecutar manualmente cada test y comprobar su
resultado), por lo que no es recomendable testear
sólo con POSTMAN
Documentación con
Swagger
Documentación con
Swagger
• Swagger es un estándar para definición de APIs
REST y un framework que nos permite visualizar su
representación y también consumir el API.
• Es una herramienta muy útil para publicar nuestra
API y que todo el mundo aprenda a usarla
rápidamente.
• Existe un bundle para Symfony2 que implementa
Swagger: NelmioApiDocBundle
Introducción a REST - SymfonyVLC

Más contenido relacionado

La actualidad más candente

Shared service centers
Shared service centersShared service centers
Shared service centersMohsen Yousefi
 
Ingeniería de Requisitos
Ingeniería de RequisitosIngeniería de Requisitos
Ingeniería de RequisitosNorerod
 
Sap s4 hana (2)
Sap s4 hana (2)Sap s4 hana (2)
Sap s4 hana (2)babloo6
 
Salesforce Integration
Salesforce IntegrationSalesforce Integration
Salesforce IntegrationJoshua Hoskins
 
Multi-function Shared Services center - an emerging trend
Multi-function Shared Services center - an emerging trendMulti-function Shared Services center - an emerging trend
Multi-function Shared Services center - an emerging trendZinnov
 
Salesforce Integration Pattern Overview
Salesforce Integration Pattern OverviewSalesforce Integration Pattern Overview
Salesforce Integration Pattern OverviewDhanik Sahni
 
Digital Operating Model & IT4IT
Digital Operating Model & IT4ITDigital Operating Model & IT4IT
Digital Operating Model & IT4ITDavid Favelle
 
Especificación de requisitos de un sitio web
Especificación de requisitos de un sitio webEspecificación de requisitos de un sitio web
Especificación de requisitos de un sitio webRafael Pedraza-Jimenez
 
Building the Business Case for SAP HANA
Building the Business Case for SAP HANABuilding the Business Case for SAP HANA
Building the Business Case for SAP HANAJohn Appleby
 
IT4IT™ - Managing the Business of IT
IT4IT™ - Managing the Business of ITIT4IT™ - Managing the Business of IT
IT4IT™ - Managing the Business of ITThe Open Group SA
 
TOGAF - ¿Por qué necesito una Arquitectura Empresarial?
TOGAF - ¿Por qué necesito una Arquitectura Empresarial?TOGAF - ¿Por qué necesito una Arquitectura Empresarial?
TOGAF - ¿Por qué necesito una Arquitectura Empresarial?Software Guru
 
Request to Fulfill Presentation (IT4IT)
Request to Fulfill Presentation (IT4IT)Request to Fulfill Presentation (IT4IT)
Request to Fulfill Presentation (IT4IT)Rob Akershoek
 
How to use abap cds for data provisioning in bw
How to use abap cds for data provisioning in bwHow to use abap cds for data provisioning in bw
How to use abap cds for data provisioning in bwLuc Vanrobays
 

La actualidad más candente (20)

Shared service centers
Shared service centersShared service centers
Shared service centers
 
Ingeniería de Requisitos
Ingeniería de RequisitosIngeniería de Requisitos
Ingeniería de Requisitos
 
SAP BI case study
SAP BI case studySAP BI case study
SAP BI case study
 
Sap s4 hana (2)
Sap s4 hana (2)Sap s4 hana (2)
Sap s4 hana (2)
 
Salesforce Integration
Salesforce IntegrationSalesforce Integration
Salesforce Integration
 
Multi-function Shared Services center - an emerging trend
Multi-function Shared Services center - an emerging trendMulti-function Shared Services center - an emerging trend
Multi-function Shared Services center - an emerging trend
 
Modelos uml compras v4
Modelos uml compras v4Modelos uml compras v4
Modelos uml compras v4
 
Cliente servidor
Cliente servidorCliente servidor
Cliente servidor
 
Electronic data interchange (edi)
Electronic data interchange (edi)Electronic data interchange (edi)
Electronic data interchange (edi)
 
ITIL vs. COBIT
ITIL vs. COBITITIL vs. COBIT
ITIL vs. COBIT
 
Salesforce Integration Pattern Overview
Salesforce Integration Pattern OverviewSalesforce Integration Pattern Overview
Salesforce Integration Pattern Overview
 
Digital Operating Model & IT4IT
Digital Operating Model & IT4ITDigital Operating Model & IT4IT
Digital Operating Model & IT4IT
 
Especificación de requisitos de un sitio web
Especificación de requisitos de un sitio webEspecificación de requisitos de un sitio web
Especificación de requisitos de un sitio web
 
Data Warehouse Cloud - Das Ende von SAP BW?
Data Warehouse Cloud - Das Ende von SAP BW?Data Warehouse Cloud - Das Ende von SAP BW?
Data Warehouse Cloud - Das Ende von SAP BW?
 
Building the Business Case for SAP HANA
Building the Business Case for SAP HANABuilding the Business Case for SAP HANA
Building the Business Case for SAP HANA
 
Integrating SSRS with SharePoint
Integrating SSRS with SharePointIntegrating SSRS with SharePoint
Integrating SSRS with SharePoint
 
IT4IT™ - Managing the Business of IT
IT4IT™ - Managing the Business of ITIT4IT™ - Managing the Business of IT
IT4IT™ - Managing the Business of IT
 
TOGAF - ¿Por qué necesito una Arquitectura Empresarial?
TOGAF - ¿Por qué necesito una Arquitectura Empresarial?TOGAF - ¿Por qué necesito una Arquitectura Empresarial?
TOGAF - ¿Por qué necesito una Arquitectura Empresarial?
 
Request to Fulfill Presentation (IT4IT)
Request to Fulfill Presentation (IT4IT)Request to Fulfill Presentation (IT4IT)
Request to Fulfill Presentation (IT4IT)
 
How to use abap cds for data provisioning in bw
How to use abap cds for data provisioning in bwHow to use abap cds for data provisioning in bw
How to use abap cds for data provisioning in bw
 

Destacado (18)

WORKSHOP I: Introducción a API REST
WORKSHOP I: Introducción a API RESTWORKSHOP I: Introducción a API REST
WORKSHOP I: Introducción a API REST
 
Introduccion a los Servicios Web Rest
Introduccion a los Servicios Web RestIntroduccion a los Servicios Web Rest
Introduccion a los Servicios Web Rest
 
Logística, CRM, ECR
Logística, CRM, ECRLogística, CRM, ECR
Logística, CRM, ECR
 
Rest Conf Rails
Rest Conf RailsRest Conf Rails
Rest Conf Rails
 
SEMINARIO: Servicios REST. Bases de la tecnología y soporte con Spring MVC
SEMINARIO: Servicios REST. Bases de la tecnología y soporte con Spring MVCSEMINARIO: Servicios REST. Bases de la tecnología y soporte con Spring MVC
SEMINARIO: Servicios REST. Bases de la tecnología y soporte con Spring MVC
 
Taller Android Party: Automatic API REST + Notificaciones PUSH
Taller Android Party: Automatic API REST + Notificaciones PUSHTaller Android Party: Automatic API REST + Notificaciones PUSH
Taller Android Party: Automatic API REST + Notificaciones PUSH
 
Automatic API REST Droidcon
Automatic API REST DroidconAutomatic API REST Droidcon
Automatic API REST Droidcon
 
REST, JERSEY & SOAP
REST, JERSEY & SOAPREST, JERSEY & SOAP
REST, JERSEY & SOAP
 
Rest
RestRest
Rest
 
Simplemente REST
Simplemente RESTSimplemente REST
Simplemente REST
 
Charla REST API
Charla REST APICharla REST API
Charla REST API
 
Arquitectura REST
Arquitectura RESTArquitectura REST
Arquitectura REST
 
144 Rest Web Services
144 Rest Web Services144 Rest Web Services
144 Rest Web Services
 
Building Automated REST APIs with Python
Building Automated REST APIs with PythonBuilding Automated REST APIs with Python
Building Automated REST APIs with Python
 
Why vREST?
Why vREST?Why vREST?
Why vREST?
 
Learn REST API with Python
Learn REST API with PythonLearn REST API with Python
Learn REST API with Python
 
Arquitectura Rest
Arquitectura RestArquitectura Rest
Arquitectura Rest
 
JSON and REST
JSON and RESTJSON and REST
JSON and REST
 

Similar a Introducción a REST - SymfonyVLC

Desarrollando un API con REST
Desarrollando un API con RESTDesarrollando un API con REST
Desarrollando un API con RESTAlex Puig
 
Creacion Apirest Back{4}app
Creacion Apirest Back{4}appCreacion Apirest Back{4}app
Creacion Apirest Back{4}appblackmatt
 
10-Unidad 3: Diseños de Vista-3.2 Usos Web Services
10-Unidad 3: Diseños de Vista-3.2 Usos Web Services10-Unidad 3: Diseños de Vista-3.2 Usos Web Services
10-Unidad 3: Diseños de Vista-3.2 Usos Web ServicesLuis Fernando Aguas Bucheli
 
Documertar APIs - Meetup.js
Documertar APIs - Meetup.jsDocumertar APIs - Meetup.js
Documertar APIs - Meetup.jsEzequiel Rial
 
Integración de Tecnologías y Plataformas.pptx
Integración de Tecnologías y Plataformas.pptxIntegración de Tecnologías y Plataformas.pptx
Integración de Tecnologías y Plataformas.pptxLuisTenorio42
 
Arquitectura de una Apis Rest en C.pptx
Arquitectura de una Apis  Rest en C.pptxArquitectura de una Apis  Rest en C.pptx
Arquitectura de una Apis Rest en C.pptxRonaldoJos15
 
Serlets y jsp prev
Serlets y jsp prevSerlets y jsp prev
Serlets y jsp prevjtk1
 
Serlets y jsp pre
Serlets y jsp preSerlets y jsp pre
Serlets y jsp prejtk1
 
Sistemas Distribuidos basados en la Web
Sistemas Distribuidos basados en la WebSistemas Distribuidos basados en la Web
Sistemas Distribuidos basados en la WebTensor
 
Clase17(introduccion a la web)
Clase17(introduccion a la web)Clase17(introduccion a la web)
Clase17(introduccion a la web)Tensor
 

Similar a Introducción a REST - SymfonyVLC (20)

REST - deSymfony2012
REST - deSymfony2012REST - deSymfony2012
REST - deSymfony2012
 
Introducción a ASP.NET Web API
Introducción a ASP.NET Web APIIntroducción a ASP.NET Web API
Introducción a ASP.NET Web API
 
Desarrollando un API con REST
Desarrollando un API con RESTDesarrollando un API con REST
Desarrollando un API con REST
 
Seminario IV: REST & Jersey
Seminario IV: REST & JerseySeminario IV: REST & Jersey
Seminario IV: REST & Jersey
 
Api rest ful
Api rest fulApi rest ful
Api rest ful
 
Creacion Apirest Back{4}app
Creacion Apirest Back{4}appCreacion Apirest Back{4}app
Creacion Apirest Back{4}app
 
Java Web Services - REST
Java Web Services - RESTJava Web Services - REST
Java Web Services - REST
 
10-Unidad 3: Diseños de Vista-3.2 Usos Web Services
10-Unidad 3: Diseños de Vista-3.2 Usos Web Services10-Unidad 3: Diseños de Vista-3.2 Usos Web Services
10-Unidad 3: Diseños de Vista-3.2 Usos Web Services
 
S7-DAW-2022S1.pptx
S7-DAW-2022S1.pptxS7-DAW-2022S1.pptx
S7-DAW-2022S1.pptx
 
Protocol HTTP
Protocol HTTPProtocol HTTP
Protocol HTTP
 
API como SaaS
API como SaaSAPI como SaaS
API como SaaS
 
Desarrollo web
Desarrollo webDesarrollo web
Desarrollo web
 
Documertar APIs - Meetup.js
Documertar APIs - Meetup.jsDocumertar APIs - Meetup.js
Documertar APIs - Meetup.js
 
Integración de Tecnologías y Plataformas.pptx
Integración de Tecnologías y Plataformas.pptxIntegración de Tecnologías y Plataformas.pptx
Integración de Tecnologías y Plataformas.pptx
 
introduccion a Ajax
introduccion a Ajaxintroduccion a Ajax
introduccion a Ajax
 
Arquitectura de una Apis Rest en C.pptx
Arquitectura de una Apis  Rest en C.pptxArquitectura de una Apis  Rest en C.pptx
Arquitectura de una Apis Rest en C.pptx
 
Serlets y jsp prev
Serlets y jsp prevSerlets y jsp prev
Serlets y jsp prev
 
Serlets y jsp pre
Serlets y jsp preSerlets y jsp pre
Serlets y jsp pre
 
Sistemas Distribuidos basados en la Web
Sistemas Distribuidos basados en la WebSistemas Distribuidos basados en la Web
Sistemas Distribuidos basados en la Web
 
Clase17(introduccion a la web)
Clase17(introduccion a la web)Clase17(introduccion a la web)
Clase17(introduccion a la web)
 

Último

KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...AlanCedillo9
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIván López Martín
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 

Último (19)

KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 

Introducción a REST - SymfonyVLC

  • 2. Contenido de la charla • Qué es REST? o o o o o Definición Conceptos Verbos HTTP Códigos de respuesta Ejemplos • APIs CRUD o Operaciones sobre recursos o Problemas de concurrencia o Operaciones asíncronas • Seguridad en REST • Testing y pruebas
  • 3. Sobre mi • Programador web PHP desde hace 4 años (aprox. 1 con Symfony2). • Muy fan de NodeJS, Angular y Javascript en general • Aficionado a la seguridad informática y redes.
  • 5. Qué es REST?  Es una tecnología?
  • 6. Qué es REST?  Es una tecnología? ✗  Es una arquitectura?
  • 7. Qué es REST?  Es una tecnología? ✗  Es una arquitectura? ✗  Es un “estilo arquitectónico”?
  • 8. Qué es REST?  Es una tecnología? ✗  Es una arquitectura? ✗  Es un “estilo arquitectónico”? ✓ Cuando hablamos de REST nos referimos a una forma de implementar una arquitectura en concreto (arquitectura WebService) por eso solemos decir que REST es sólo un estilo de elaborar servicios web.
  • 10. ¿Qué es REST? • La primera vez que se habló de REST fue en el año 2000 en la tesis doctoral de Roy Fielding, uno de los principales autores del protocolo HTTP • Está orientado a transferencias de recursos, no a llamadas de procedimientos remotos (RPC) • Hace un uso muy eficiente del protocolo HTTP, rompe con el esquema de la web que funciona solo con GET y POST
  • 11. REST en la actualidad • A día de hoy se conoce por REST a casi cualquier servicio Web que trabaje con XML y HTTP • La mayor parte de las APIs existentes son simples interfaces para interactuar con la base de datos (CRUD básico) • REST nos permite modelar totalmente nuestro negocio sin importar el lenguaje en que este implementado el servicio o el cliente
  • 12. Conceptos y reglas • El servicio representará recursos, no acciones o No se publican verbos como “comprar” o Se usan recursos como “pedido” o “compra” • Todos los recursos deben de poseer un UUID o Universal Unique Identifier o Todo recurso en REST necesita un UUID para ser identificado dentro del sistema • La forma en que se represente internamente un recurso debe ser privada • Todos los recursos deben de poseer un interfaz de operaciones, y todos deben de implementarlas.
  • 13. Cómo funciona? • Las operaciones se realizan por transferencia de estado o El cliente pide una copia del recurso al servicio o El cliente modifica el recurso o El cliente transfiere el recurso actualizado al servicio • Los recursos deben ser multimedia o Los recursos deben de poder expresarse en más de un formato • JSON, XML, CSV… o En las peticiones podemos y debemos indicar el tipo de formato que admitimos, o una lista con varios, ordenada por prioridades. • Según la implementación que se consiga, un API se cataloga en uno de los niveles REST
  • 14.
  • 15. Verbos HTTP • El protocolo HTTP define un conjunto de verbos que nos permiten realizar todo tipo de operaciones: o o o o o o GET (LEER) PUT (CREAR O ACTUALIZAR RECURSO COMPLETO) POST (CREAR, ACTUALIZAR PARCIALMENTE UN RECURSO) PATCH (ACTUALIZAR PARCIALMENTE UN RECURSO) DELETE (BORRAR) OPTIONS (CONSULTAR OPERACIONES) • http://www.restapitutorial.com/lessons/httpmethods.html • Usarlos incorrectamente lleva a desastres como el de Basecamp. o http://www.mail-archive.com/isn@attrition.org/msg04213.html
  • 16.
  • 17. POST e idempotencia • POST es él verbo “maldito” por REST, al no ser idempotente. • La idempotencia asegura que ejecutar n veces una transferencia obtendrá el mismo resultado. • Se usa para modelar operaciones como: o Crear recursos o Modificar parcialmente recursos…
  • 18. Códigos de Respuesta • El resultado de una transferencia REST viene dado por el código de estado de la respuesta HTTP, en REST, los más habituales son: o o o o o o o o o o o o • 200 (OK) 201 (Creado) 202 (Aceptado) 204 (Sin contenido) 304 (No modificado) 400 (Petición mal formada) 401 (No autorizado) 403 (Acceso no permitido) 404 (No encontrado) 409 (Conflicto) 412 (Fallo de pre-condición) 500 (Problema de Servidor) http://www.restapitutorial.com/httpstatuscodes.html
  • 20. Ejemplos En nuestra API de pruebas usaremos: • GET o o • Eliminar recursos o • Actualizaciones totales de recursos o • Actualizaciones parciales o • Creación de recursos o • Obtener recursos o colecciones de recursos Consultar acciones disponibles POST PATCH PUT DELETE OPTIONS La URL sobre la que trabajaremos será: http://symfonyvalencia.es/api/usuarios El servidor puede devolver datos en XML o en JSON
  • 21. Transferencia OPTIONS Consultar acciones Cliente OPTIONS /api/usuarios/B2K1E3 Host: www.symfonyvalencia.es Servidor HTTP/1.1 200 OK Allow: GET, PUT, POST, OPTIONS, DELETE, PATC H
  • 22. Transferencia GET Obtener una Colección Cliente GET /api/usuarios HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor
  • 23. Transferencia GET Obtener una Colección Cliente GET /api/usuarios HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor HTTP/1.1 200 OK Content-Type: application/json [{ “id”: “X1B4Z3”, “nombre”: “Miguel Ángel”, “edad”: 27, “lenguajes”: [“PHP”, “Javascript”] }, { “id”: “AB325J”, “nombre”: “Ángel Miguel”, “edad”: 26, “lenguajes”: [“Ruby”, “Java”] }]
  • 24. Transferencia GET Obtener un registro Cliente GET /api/usuarios/X1B4Z3 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor
  • 25. Transferencia GET Obtener un registro Cliente GET /api/usuarios/X1B4Z3 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor HTTP/1.1 200 OK Content-Type: application/json Etag: W/2cc7-3f3ba34cc25d { “id”: “X1B4Z3”, “nombre”: “Miguel Ángel”, “edad”: 27, “lenguajes”: [“PHP”, “Javascript”] }
  • 26. Transferencia POST Crear un recurso Cliente POST /api/usuarios HTTP/1.1 Host: www.symfonyvalencia.es Content-Type: application/x-wwwform-urlencoded Accept: application/json nombre=Manolo&edad=26&localidad =Valencia Servidor
  • 27. Transferencia POST Crear un recurso Cliente POST /api/usuarios HTTP/1.1 Host: www.symfonyvalencia.es Content-Type: application/x-wwwform-urlencoded Accept: application/json nombre=Manolo&edad=26&localidad =Valencia Servidor HTTP/1.1 201 Created Content-Type: application/json Location: http://symfonyvalencia.es/usuarios/B2 K1E3 Etag: W/2cc7-3f3ba34cc25d { ”id”: “B2K1E3” }
  • 28. Transferencia PUT Actualizar un recurso Cliente PUT /api/usuarios/X1B4Z3 Host: www.symfonyvalencia.es Content-Type: application/json Accept: application/json { “nombre”: “Miguel Ángel”, “edad”: 27, “lenguajes”: [„PHP‟, „Javascript‟], “localidad”: “Valencia” } Servidor
  • 29. Transferencia PUT Actualizar un recurso Cliente PUT /api/usuarios/X1B4Z3 Host: www.symfonyvalencia.es Content-Type: application/json Accept: application/json { “nombre”: “Miguel Ángel”, “edad”: 27, “lenguajes”: [„PHP‟, „Javascript‟], “localidad”: “Valencia” } Servidor HTTP/1.1 204 No Content Content-Type: application/json Etag: W/2cc7-3f3ba34cc25d
  • 30. Transferencia DELETE Eliminar un recurso Cliente DELETE /api/usuarios/B2K1E3 Host: www.symfonyvalencia.es Servidor HTTP/1.1 204 No Content
  • 31. API’S CRUD Las API‟s CRUD son el tipo de API más extendido en el mundo REST
  • 32. APIs CRUD • Son las APIs más habituales • CRUD o o o o Create (crear) Read (leer) Update (actualizar) Delete (borrar) • Cubren las operaciones básicas que realizamos habitualmente sobre entidades • Implementan todos los verbos HTTP • Son lo contrario a APIs read-only • Son bastante sencillas de implementar • En Symfony2 existen bundles que facilitan su implementación, como FOSRESTBundle
  • 33. APIs CRUD • Si pretendemos ceñirnos absolutamente al concepto de API REST, no debemos de diseñar nuestra API como un reflejo de las entidades, ya que expone nuestro esquema de base de datos. • Un cambio en una entidad no debería de afectar al uso del API. • Se trata de modelar nuestro negocio con operaciones sobre recursos no de crear un interfaz para gestionar nuestra base de datos.
  • 34. Acceso concurrente • Si a nuestro Web Service se conectan simultáneamente varias personas y modifican el mismo registro… ¿Puede haber problemas de inconsistencia? • El problema de la inconsistencia en REST se soluciona habitualmente con la inclusión de cabeceras Etag y If-Match. • Se utilizan Etags débiles, ya que las fuertes son demasiado estrictas para nuestro propósito
  • 35. Ejemplo 1/3 Cliente GET /api/usuarios/X1B4Z3 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor HTTP/1.1 200 OK Content-Type: application/json;charset=utf-8 Etag: W/689438a788bbc2e { “id”: “X1B4Z3”, “nombre”: “Miguel Ángel”, “edad”: 27, “lenguajes”: [“PHP”, “Javascript”] }
  • 36. Ejemplo 2/3 Cliente PUT /api/usuarios/X1B4Z3 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json If-Match: W/689438a788bbc2e Content-Type: application/json { “id”: “X1B4Z3”, “nombre”: “Miguel Ángel Sánchez”, “edad”: 23, “lenguajes”: [“PHP”, “Javascript”], “localidad”: “Valencia” } Servidor (Match OK) HTTP/1.1 204 No Content Etag: W/91246ef669ab7
  • 37. Ejemplo 3/3 Cliente PUT /api/usuarios/X1B4Z3 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json If-Match: W/689438a788bbc2e Content-Type: application/json { “id”: “X1B4Z3”, “nombre”: “Miguel Ángel Sánchez”, “edad”: 23, “lenguajes”: [“PHP”, “Javascript”], “localidad”: “Valencia” } Servidor (Match KO) HTTP/1.1 412 Precondition Failed Etag: W/91246ef669ab7
  • 38. Actualizaciones parciales • Otro problema básico en REST es la actualización parcial del contenido. • Si usamos PUT, sobrescribimos todo el recurso, ¿y si solo queremos cambiar un atributo del recurso? • El método habitual se basa en crear nuevos tipos MIME de cambio de estado o diff y usar POST. • La solución moderna pasa por usar el verbo PATCH, funciona igual que con POST, pero es más semántico y solo admite tipos MIME que representen diffs
  • 39. Actualizaciones parciales • Cuando hablamos de diffs hablamos de crear un formato o tipo MIME que represente una operación de actualización parcial sobre un registro. • Suelen nombrarse como: o application/recurso-diff+formato • Recurso es el tipo de entidad (usuario, factura…) • Formato puede ser cualquier formato (json, xml…) • Ejemplos: o application/usuario-diff+json o application/usuario-diff+xml
  • 40. Ejemplo de actualización PATCH /api/usuarios/X1B4Z3 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json If-Match: W/979c576c5be5fa5 Content-Type: application/usuario-diff+json [{ }, { }] “tipo-cambio”: “sustituir”, “campo”: “edad”, “valor”: “23” “tipo-cambio”: “anadir”, “campo”: “localidad”, “valor”: “Valencia”
  • 42. Operaciones de larga duración o asíncronas Cuando las operaciones no son inmediatas, o deben ser encoladas porque se procesan en bloque a cierta hora mediante un cron, o necesitan validación de un servicio externo (pasarelas de pago, Paypal…), el usuario debe de poder seguir el estado del recurso. Con REST es posible modelar operaciones asíncronas o encolables creando un recurso intermedio que represente el estado del recurso antes de finalizar su creación.
  • 43. Ejemplo • Vamos a realizar un pago a una tienda online vía REST • El pago debe de ser validado por la entidad bancaria que implementa la pasarela de pago. • El proceso puede tardar entre 3 y 5min • El cliente desea saber cuando ha sido validado el pago
  • 44. Ejemplo 1/4 Cliente POST /api/pago HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Content-Type: application/json Servidor HTTP/1.1 202 Accepted Location: /api/cola-pago/XBC3719 { “location”: “/api/cola-pago/XBC3719”, “estado”: “pendiente” { “metodo”: “visa”, “numtarjeta”: 1234567812345678, “cvv”: 123 “caducidad”: “12/17” “cantidad”: 2500 } }
  • 45. Ejemplo 2/4 Cliente GET /api/cola-pago/XBC3719 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor HTTP/1.1 200 OK Content-Type: application/json { “estado”: “pendiente” }
  • 46. Ejemplo 3/4 Cliente GET /api/cola-pago/XBC3719 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor (Pago OK) HTTP/1.1 200 OK Content-Type: application/json { “estado”: “ok”, “id”: “/api/pago/DEB743AC” }
  • 47. Ejemplo 3 bis/4 Cliente GET /api/pago/DEB743AC HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor (Pago OK) HTTP/1.1 200 OK Content-Type: application/json { “metodo”: “visa”, “numtarjeta”: 1234567812345678, “cvv”: 123 “caducidad”: “12/17” “cantidad”: 2500 “estado”: “pagado” }
  • 48. Ejemplo 4/4 Cliente GET /api/cola-pago/XBC3719 HTTP/1.1 Host: www.symfonyvalencia.es Accept: application/json Servidor (Error de pago) HTTP/1.1 200 OK Content-Type: application/json { “estado”: “error”, “error”: “sin fondos }
  • 49. Seguridad en REST No todas las API‟s son públicas
  • 50. Seguridad en REST • En el contexto de un servicio REST no existe el concepto de Sesión, ya que HTTP es un protocolo Stateless no orientado a conexión. • Si nuestra API necesita autenticar a sus usuarios, estos deben de hacerlo en cada petición • Esto simplifica un ataque por parte de intrusos • Veamos algunas normas básicas de seguridad en REST
  • 51. 1. No uses IDs predecibles
  • 52. 1. No uses IDs predecibles • Cualquier intruso que sniffe nuestro tráfico y detecte una petición del tipo: GET /api/usuario/1/datos-bancarios • Se verá tentado de probar con: GET /api/usuario/2/datos-bancarios GET /api/usuario/3/datos-bancarios GET /api/usuario/n/datos-bancarios • Tampoco debemos usar las claves primarias de nuestra base de datos, nos exponemos a ataques SQLi
  • 54. 2. Usa HTTPS • Con el protocolo HTTPS ya tenemos ganado la mitad • Es un protocolo seguro y el contenido va cifrado, tanto para peticiones como para respuestas. • Si transmitimos información sensible no será fácilmente reproducible por un atacante que haya usado un sniffer • Nos da seguridad a la hora de transmitir contraseñas
  • 55. 3. Genera Tokens de seguridad
  • 56. 3. Genera Tokens de seguridad • Si creamos nuestro propio esquema de seguridad, generando Tokens que caduquen cada cierto tiempo, evitaremos transmitir la contraseña demasiadas veces. • Después de la primera autenticación, el servidor nos transmite nuestro Token • En las próximas peticiones lo incorporaremos en una cabecera, o una cookie
  • 58. 4. Algoritmo HMAC • Nos puede ayudar a construir buenos Tokens PARTE_PUBLICA = UUID + “:” + NIVEL_SEGURIDAD + ”:” + TIMESTAMP FIRMA = HMAC(CLAVE_SECRETA, PARTE_PUBLICA) TOKEN = FIRMA + ”_” + PARTE_PUBLICA • Desde el servidor basta con descomponer el Token en las componentes FIRMA y PARTE_PUBLICA, volver a calcular la firma con la PARTE_PUBLICA recibida y comparar la firma generada con la recibida
  • 59. 4. Algoritmos ajustables • Algoritmos como BCRYPT o PBKDF aceptan un parámetro de “complejidad”, que permiten indicar cuanto tardará en calcularse la contraseña. • Esto limita los ataques de fuerza bruta, por ejemplo, con una complejidad de 500ms solo podrían probarse 2 passwords por segundo.
  • 61. 5. Usa OAuth • Una opción alternativa a generar nuestros tokens es implementar un servidor OAuth que nos permita acceder a nuestra API • Existen librerías en casi todos los lenguajes que implementan OAuth • Podemos incluso usar nuestros credenciales en redes sociales para acceder a nuestra API.
  • 62. Testing y pruebas Asegurándonos de que todo anda bien
  • 64. Testing y pruebas • Como cualquier otro programa, aplicación web… que desarrollemos, las APIs REST se pueden implementar usando TDD. • Es importante testear siempre que todos los códigos de respuesta devueltos son adecuados, tanto para casos de éxito como para casos de error. • IMPORTANTE: Muchos frameworks implementan listeners de excepciones y evitan, por ejemplo que una página devuelva un 404, enmascarando el resultado con una respuesta 200.
  • 65. Testing con xUnit • Podemos usar tranquilamente nuestro framework de pruebas xUnit para testear, no solo los códigos de respuesta, sino toda la lógica de negocio. • Las prácticas habituales de testing con este tipo de herramientas son totalmente válidas para el testeo.
  • 67. Testing con cURL • Es una alternativa para realizar nuestros tests (cURL + Shell Script) • Con cURL podemos crear exactamente la transferencia que buscamos. • Si se tienen suficientes conocimientos sobre cURL se pueden crear buenos tests con un tiempo de ejecución bastante bajo.
  • 68. Testing con Guzzle … porque cURL no es para todos los públicos
  • 69. Testing con Guzzle (PHP) • Guzzle es una librería en PHP que actúa como un wrapper de cURL, exprimiendo al máximo su potencia. • Permite crear clientes REST muy potentes y escalables • Es realmente sencillo de utilizar y es orientado a objetos • Se integra bien con PHPUnit.
  • 71. Testing con POSTMAN • POSTMAN es un plugin para Chrome que actúa como cliente REST • Nos permite guardar las transferencias preconfiguradas • Permite autenticación mediante OAuth de forma bastante sencilla • No es una herramienta automática (hay que ejecutar manualmente cada test y comprobar su resultado), por lo que no es recomendable testear sólo con POSTMAN
  • 73. Documentación con Swagger • Swagger es un estándar para definición de APIs REST y un framework que nos permite visualizar su representación y también consumir el API. • Es una herramienta muy útil para publicar nuestra API y que todo el mundo aprenda a usarla rápidamente. • Existe un bundle para Symfony2 que implementa Swagger: NelmioApiDocBundle