REST - deSymfony2012

Post on 19-Jun-2015

7.759 views 0 download

description

Repasaremos conceptos y principios para que una arquitectura sea RESTfull, se explicará cómo se ha plateado el framework Leophard para seguir estos y otros principios.

Transcript of REST - deSymfony2012

Hola

Asier Marqués

Simettric, Fundador.

4VisionsManager.com, Socio y director técnico.

Desacoplar el cliente del backend

• Mayor escalabilidad

• Separación de problemas

• División de especialidades

• API uniforme para todos los clientes

REST

REST

REpresentational State Transfer

Un estilo de arquitectura para

desarrollar aplicaciones web distribuidas

que se basa en el uso del protocolo

HTTP e Hypermedia.

Definido en el 2000 por Roy Fielding

Una buena API REST

No tiene estado en el backend.

Está desacoplado del cliente.

Dispone de una interfaz uniforme

(basada en URIs)

Richardson Maturity Model

# Nivel 1 (Pobre):

Se usan URIs para identificar recursos

# Nivel 2 (Medio):

Se usa el protocolo HTTP adecuadamente

# Nivel 3 (Óptimo):

Se implementa hypermedia.

http://www.crummy.com/writing/speaking/2008-QCon/act3.html

Recursos, URIs, hypermedia?

REST: Nivel 1

URIs

URI, uniform resource identifier

Identifica un recurso

Pueden identificar un

recurso por nombre

(URN) o por

localización (URL)

Recurso?

Recursos

/users Listado de usuarios

/users/{id} Un usuario

Reglas para identificar recursos

• Se debe *identificar* un recurso!

• Las URIs se construyen con nombres

nunca con verbos

• Deberían tener una estructura

jerárquica

URIs incorrectas

Nunca se usan verbos

/getUser/{id}

/users/{id}/edit

/login

Deben ser jerárquicas

/invoices/user/{id}

Identifican un recurso

/invoices/page/2

URIs válidas

Nunca se usan verbos

/users/{id}

/users/{id}

/access-token

Deben ser jerárquicas

/user/{id}/invoices

Identifican un recurso

/invoices/?page=2

Formatos

No se debería indicar el formato en la

URI, el formato no identifica al recurso

/invoices.html

/invoices.css

/invoices.xml

Para eso está HTTP

Request:

GET accept: text/html /invoices

Response:

200 content-type: text/html

Response:

406 Not Acceptable

REST: Nivel 2

HTTP como framework

HTTP como Framework

• Protocolo de transporte

• Métodos

• Códigos de estado

• Content-Type

• Gestión de versiones

• Cache

HTTP: Métodos

GET Recupera el recurso

POST Crea un nuevo recurso

PUT Edita el recurso

POST/PATCH Edita el recurso parcialmente

DELETE Elimina el recurso

Métodos

Request: GET /users

Response: 200 content-type:application/json

Request: POST /users

Response: 201 content-type:application/json

Métodos

Request: GET /users/11

Response: 200 content-type:application/json

Request: PUT /users/11

Response: 200 content-type:application/json

Request: DELETE /users/11

Response: 204 no content

HTTP: Códigos de estado

HTTP: Content-Type y Accept

Content-Type y Accept

• Content-Type nos dice qué tipo de

representación tiene el recurso al que

estamos accediendo.

• Con Accept le decimos qué tipo de

representación queremos.

HTTP: ETag

HTTP: Etag y Last-Modified

• Con Etag podemos controlar si el recurso se

ha modificado desde la última vez que

accedimos con un hash.

• If-None-Match se encarga de indicar que la

petición sea efectiva siempre y cuando el

eTag sea distinto, If-Match hace lo inverso.

• Last-Modified/If-Modified-Since permiten

saber si un recurso se ha modificado en base

a una fecha.

REST: Nivel 3

Hypermedia

Hypermedia?

Hypermedia

• Se basa en la idea de enlazar

recursos.

• Para que sea útil, el cliente debe

saber que en la respuesta hay

contenido hypermedia.

• En content-type es clave para esto

<bill rel=“http://api.servicio.com/doc/order”>

<id>666</id>

<currency>EUR</currency>

<items>..</items>

<amount>67</amount>

<status>UNPAID</status>

<links>

<link rel=“payment”>

http://api.servicio.com/order/666/payment

</link>

<link rel=“cancel”>

http://api.servicio.com/order/666/cancelation

</link>

</links>

</bill>

Hypermedia

¿Content-Type: text/xml?

Hypermedia

Content-Type: text/xml

Content-Type:

application/servicio+xml

RFC4627 JSON Hypertext Application Language

Content-Type: application/hal+json

{

"_links": {

"self": {"href": "/orders/523" },

"warehouse": {"href": "/warehouse/56" },

" invoice": {"href": "/invoices/873“}

},

"currency": "USD",

"status": "shipped",

"total": 10.20

}

http://tools.ietf.org/html/draft-kelly-json-hal-00

Herramientas

Curl

RestClient

Swagger UI (swagger.wordnik.com)

Servicios

3scale.com

apigee.com

Crear un Framework REST

Puntos clave de un framework

• Facilitarnos el trabajo

• Definir una forma de trabajo común

• Reducir tareas repetitivas

Symfony2 Components

HTTP Foundation

Routing

ClassLoader

Console

HTTP Foundation

• Se basa en dos objetos: Request y

Response

• Nos aisla de variables de entorno,

servidor, headers…

Routing

• Podemos definir URIs mediante

patrones

• Requisitos en las URIs de métodos

HTTP y parámetros.

• Varios tipos de Matcher para

identificar la URI actual.

Console

• Nos permite crear comandos para

shell

• Cada comando es una clase, permite

definir parámetros, atributos para el

comando

• Los menús se generan de forma

automática

Crear un framework REST

• Crearlo sobre una aplicación real

• Utilizar el componente Console para

automatizar tareas repetitivas

• Pensar en la organización del código

Crear un framework REST

• Eventos

• Permitir extensibilidad

• Configuraciones, diferentes entornos

• Logs y gestión de excepciones

Crear un framework REST

• Sólo lo estrictamente necesario en el

core

• Documentación

• Cobertura de tests

• Aprende de otros

C

O

N

V

E

N

C

I

Ó

N

Documentación

Gracias :)

@asiermarques