APIs REST #devfestBilbao

45
#REST Asier Marqués @asiermarques

description

Mi charla sobre APIs REST para el Dev Fest Bilbao.

Transcript of APIs REST #devfestBilbao

Page 1: APIs REST #devfestBilbao

#REST

Asier Marqués

@asiermarques

Page 2: APIs REST #devfestBilbao

linkedin.com/in/asier @asiermarques

Page 3: APIs REST #devfestBilbao

HTTP

Page 4: APIs REST #devfestBilbao

HTTP - RFC 2616

Request Response

Page 5: APIs REST #devfestBilbao

Request

GET /usuarios Accept: text/html, application/json

Page 6: APIs REST #devfestBilbao

Response

GET /usuarios Status Code: 200 Content Type: application/json

Page 7: APIs REST #devfestBilbao

¿Por qué hacer APIs HTTP?

Evitar la dependencia del cliente con el backend.

Utilizar un protocolo maduro, probado y muy usado.

Mejorar la integración con servicios o

aplicaciones de terceros.

Page 8: APIs REST #devfestBilbao

RESTFul

Page 9: APIs REST #devfestBilbao
Page 10: APIs REST #devfestBilbao

Richardson Madurity Model

Nivel 1 – Uso correcto de las URIs

Nivel 2 – Uso correcto de HTTP

Nivel 3 – Hypermedia

Page 11: APIs REST #devfestBilbao

Nivel 1 - URIs

Page 12: APIs REST #devfestBilbao

Recursos y URIs

Cada información con la que queramos trabajar es un recurso. Usamos URLs, un tipo de URI que identifica y localiza un recurso.

Page 13: APIs REST #devfestBilbao

Recursos

Un listado de usuarios → /usuarios

Un usuario → /usuarios/{id}

Page 14: APIs REST #devfestBilbao

Nombrar recursos

Usamos nombres, no verbos

Utilizamos una estructura jerárquica

Evitamos añadir: Nombres de formatos Extensiones Filtros, órdenes paginaciones

Page 15: APIs REST #devfestBilbao

Incorrecto

Perfil de usuario → /getUser/{id}

Edición de usuario → /users/{id}/edit

Paginación de listado → /users/page/{page}

Relaciones → /invoices/user/{id}

Page 16: APIs REST #devfestBilbao

Incorrecto

Perfil de usuario → /getUser/{id}

Edición de usuario → /users/{id}/edit

Paginación de listado → /users/page/{page}

Relaciones → /invoices/user/{id}

Page 17: APIs REST #devfestBilbao

Correcto

Perfil de usuario → /users/{id}

Edición de usuario → /users/{id}

Paginación de listado → /users?page={page}

Relaciones → /user/{id}/invoices

Page 18: APIs REST #devfestBilbao

Contenidos parciales, filtrados parciales

GET /usuario/{id}?campos=id,nombre,email

Status Code: 206

Page 19: APIs REST #devfestBilbao

Formatos

Incorrecto

GET /user/{id}.xml

Accept: text/html

Correcto

GET /user/{id}

Accept: application/xml

Page 20: APIs REST #devfestBilbao

Nivel 2 - HTTP

Page 21: APIs REST #devfestBilbao

Métodos HTTP

Leer → GET

Crear → POST

Editar → PUT Editar parcialmente → PATCH

Eliminar → DELETE Opciones disponibles → OPTIONS

Page 22: APIs REST #devfestBilbao

Códigos de estado HTTP

No reinventar la rueda

RFC 2616 – Sección 10

Información → 1XX

Éxito → 2XX Redirección, proxy o caché → 3XX

Error de cliente → 4XX Error de servidor → 5XX

Page 23: APIs REST #devfestBilbao

Tipo de contenido, media types HTTP

Request

GET /recurso Accept: application/json

Response

GET /recurso

Status Code 200

Content Type: application/json

Page 24: APIs REST #devfestBilbao

Nivel 3 - Hypermedia

Page 26: APIs REST #devfestBilbao

HATEOAS

Hypermedia as the Engine of Application State

RSDL

REST Service Description Language

Page 27: APIs REST #devfestBilbao

GET pedido/{id}

<pedido> <id>666</id> <estado>Procesado</estado> <links>

<link rel=”factura”> http://api.acme.com/api/pedido/666/factura

</link> <link rel=”pago”>

http://api.acme.com/api/pedido/666/pago </link>

</links> </pedido>

Page 28: APIs REST #devfestBilbao

Hypermedia y HATEOAS

Nos permite desacoplar al máximo el cliente del

servidor.

Nos da flexibilidad ante cambios futuros en

nuestra API.

Nos permite automatizar peticiones sin tener que

conocer de antemano la API.

Utilizamos media type propios.

Accept: application/vnd.{tu servicio} +json

Page 29: APIs REST #devfestBilbao

GET /pedido/{id}

Request

Accept: application/vnd.acme+xml, application/xml

Response

Content Type:

application/vnd.acme+xml

Page 31: APIs REST #devfestBilbao

GET /users/john {

"username": "john", "bio": "Un tipo majísimo, siempre saluda en la escalera.", "real_name": "John Smith”, "_embedded": { "rs:addresses": [] },

"_links": { "self": { "href": "/users/john” },

"curies": [{ "name": "rs", "href": "http://api.acme.com/docs/rels/{rel}", "templated": true

}], "rs:posts": { "href": "/users/john/posts“ }, "rs:follow”: { "href": "/users/john“ }

} }

Page 32: APIs REST #devfestBilbao

GET /users/john {

"username": "john", "bio": "Un tipo majísimo, siempre saluda en la escalera.", "real_name": "John Smith”, "_embedded": { "rs:addresses": [] },

"_links": { "self": { "href": "/users/john” },

"curies": [{ "name": "rs", "href": "http://api.acme.com/docs/rels/{rel}", "templated": true

}], "rs:posts": { "href": "/users/john/posts“ }, "rs:follow”: { "href": "/users/john“ }

} }

Page 33: APIs REST #devfestBilbao

Más cosas

Page 34: APIs REST #devfestBilbao

Versiones

En la URI

/api/v1/recurso

En el content-type

application/vnd.acme+json;v=1

application/vnd.acme-1+json

Page 35: APIs REST #devfestBilbao

Seguridad

Autenticación HTTP: Basic, Digest

Sistema propio basado en tokens

OAuth

Gateways: Layer7, apigee enterprise, 3scale...

+ HTTPs (no es opcional)

Page 36: APIs REST #devfestBilbao

Operaciones asíncronas

Callback URLs

Notificaciones PUSH

Inbound email parsing

Page 37: APIs REST #devfestBilbao

Disponibilidad de formatos

Request

GET /recurso

Accept: application/xml

Response (formato disponible)

GET /recurso Content Type: application/xml

200

Response (formato no disponible) GET /recurso

406 Not acceptable

Page 38: APIs REST #devfestBilbao

Uso de Etiquetas HTTP

Request

PUT /recurso

If-Match: “XXXX”

Response

PUT /recurso

200

Etag: “YYYY”

Request

PUT /recurso

If-Match: “XXXX”

Response

PUT /recurso

412 Precondition Failed

Etag: “YYYY”

Page 39: APIs REST #devfestBilbao

Descripción de errores

Request

POST /users

Response

POST /users

201 Created

Request

POST /users

Response

POST /users

400 Conflict

Content

{

“_errors”: [{

“email”: “email is in use”

}]

}

Page 40: APIs REST #devfestBilbao

Utilizando OPTIONS

Request OPTIONS /users

Response 200

Allow: GET, POST Content: { "POST": { "description": “Creamos un usuario",

"parameters": {} }, “GET”: { "description": “Recuperamos el listado de usuarios“ }

}

Page 41: APIs REST #devfestBilbao

BaaS

Backend as a service

Page 42: APIs REST #devfestBilbao

Disponemos de una API de servidor totalmente

funcional en minutos.

Sin problemáticas de infraestructura,

administración de servidores..

Integración con servicios de terceros out of the

box, en algunos casos.

Personalización del código de la API mediante Javascript y Eventos.

BAAS, Backend as a Service

Page 43: APIs REST #devfestBilbao
Page 44: APIs REST #devfestBilbao
Page 45: APIs REST #devfestBilbao

Gracias

@asiermarques