Está en la página 1de 50

RESTful con Flask

y Python
John Sanabria
Agenda
● Introducción
● Evolución de WWW
● SOA - Service Oriented Architecture
● Arquitectura RESTful (REpresentational State Transfer)
Web services

Source: https://es.stackoverflow.com/questions/221288/cuando-utilizar-una-api-y-cuando-un-web-service
Restful Web Services

Source: https://gocoding.org/what-are-restful-web-services/
Web services - Evolución WWW
Web Services - SOA
● El SOA se puede entender
como una mezcla de RPC
sobre HTTP/TCP/IP
● Otras iniciativas para
comunicarse remotamente:
CORBA, DCOM, Java RMI.
Estas iniciativas estaban
muy atadas a los
proveedores
Web Services - SOA
● SOA brinda una forma de construir y
componer servicios de forma modular
● SOA provee
○ Descripción, publicación y descubrimiento de
interfaces
○ Componentes o servicios accedidos de forma
estandarizada
Características de SOA
● Escalable
● Debilmente acoplado
● Interoperable
● Descubrible
● Abstracto
● Estandarizado
Web Services - SOAP
● Son aplicaciones auto-describibles, auto-contenidas
accesible a través de Internet
● Inicialmente los web services se accedían a través de
XML usando el estándar SOAP
● Siglas
○ SOAP - Simple Object Access Protocol
○ WSDL - Web Service Description Language
○ UDDI - Universidad Description, Discovery and
Integration
Web Services - Protocolos SOAP
La pila de programación de los web
services
● Esta pila es un conjunto de protocolos
estandarizados y APIs que permiten
localizar y actualizar Web Services
● La estandarización permite el uso ubicuo
de la tecnología
○ La comunicación es a través del
protocolo HTTP
○ SOAP, basado en XML, es quien
permite la publicación, búsqueda,
enlace e invocación de operaciones
○ La parte de la publicación y capas
superiores se pueden considerar
opcionales
○ Existen otras características
deseable y transversales como:
seguridad, gestión y calidad del
servicio
Web Services - Interacción fundamental
SOA

● Servidor publica usando


WSDL
● Cliente busca usando
UDDI
● Comunicación a través
de SOAP
● Mensajes represenados
en XML
¿Qué pasó con SOAP?
Qué es REST?
● Sigue un esquema cliente/servidor
● No tiene estado - stateless
● Cacheable - las solicitudes de los clientes pueden
quedar en cache o no, decisión del server
● Sistema por capas - el acceso del cliente al servidor
sigue unos protocolos claramente definidos
● Acceso uniforme - las interfaces entre el cliente y el
servidor esta claramente establecidas
● Código en demanda - servidores ofrecen código que
puede ser ejecutado por clientes
REST
● REST es un esquema arquitectural diseñado
para ser usado con el protocolo HTTP
Que es un RESTful web service?
● El concepto clave en los RESTful web
services es la noción de recurso
● Los recursos se representan por URIs
● El cliente envía solicitudes a estos URIs
usando métodos definidos en HTTP
Comparación SOAP vs REST
https://twitter.com/getpostman/status/16592941
38712354817
Diseñando un web service
● Identificar el recurso a ser expuesto
● Determinar como el exterior puede
interoperar, modificar o acceder a este
recurso
Operaciones en un RESTful web service
Los datos provistos por
la solicitud se pueden
representar como blob
en JSON.
Ejemplo Twitter
Una aplicación sencilla
● Han escuchado del método ‘Getting things
done’?
● Este método se basa en las llamadas To Do
list
● Se va a desarrollar un web service que
ayude a gestionar un To Do list a través de
un web service
Definiendo el punto de acceso
● El URL de acceso al servicio será
http://<hostname>/todo/api/v1.0/
○ todo: nombre de la aplicación
○ v1.0: la versión de la aplicación
● La definición del URL es determinada a
potestad por el desarrollador
Código
● El código esta aquí https://github.com/josanabr/gtd-flask
● Python
$ git clone https://github.com/josanabr/gtd-flask.git
$ cd gtd-flask && vagrant up && vagrant ssh
$ sudo apt update && sudo apt install python-pip -y
$ export LC_ALL=C
$ sudo pip install --upgrade pip && sudo pip install virtualenv
$ cd /vagrant && virtualenv venv && source venv/bin/activate
$ pip install flask
Métodos HTTP aplicados a la aplicación
Definición de tarea
● Un To Do list esta conformado por tareas
● Una tarea se puede definir
○ id: identificador único
○ title: descripción corta de la tarea
○ description: descripción larga de la tarea
○ done: estado de la tarea
Nuestro primer web service en Flask
#!flask/bin/python
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return "Hello, World!"

if __name__ == '__main__':
app.run(debug=True)
Nuestro primer web service in Flask
● Guarde las líneas anteriores en un archivo
llamado flask-app.py
● Cambie sus permisos
chmod a+x flask-app.py
● Ejecute su aplicación
python flask-app.py
● Abra su navegador y vaya a la dirección
http://127.0.0.1:5000
Implementado servicios RESTful en Python
y Flask

● La aplicación deberá permitir la gestión de


tareas
○ Adicionar
○ Remover
○ Modificar tareas
● Las tareas se almacenarán en memoria,
formato JSON
Interactuando con el código
● Visite el archivo app.py y remueva los
símbolos ‘’’ inmediatamente después de las
líneas que contengan la frase
# INICIO - codigo comentado 1
y antes de las líneas
# FIN - codigo comentado 1
Explicación
● Se ha definido en JSON las tareas que hay
en el sistema al comienzo
● Existe un método que le permite listar las
tareas llamado get_tasks() pero que se
accede a través del protocolo HTTP con el
URL http://<server>:5000/todo/api/v1.0/tasks
Interactuando con el web service
● El comando curl permite generar fácilmente
todos los tipos de peticiones que requerimos
para interactuar con nuestra aplicación
curl -i
http://localhost:5000/todo/api/v1.0/tasks
Métodos HTTP aplicados a la aplicación
Interactuando con el código
● Ya se tiene un método para listar todas las tareas
● Ahora se habilitará el método que permite traer los
datos de una tarea particular
● Visite el archivo app.py y remueva los símbolos ‘’’
inmediatamente después de la línea que contenga la
frase
# INICIO - codigo comentado 2
y antes de la línea
# FIN - codigo comentado 2
Interactuando con el web service
● Invoque el comando curl para traer la tarea
número 2
curl -i
http://localhost:5000/todo/api/v1.0/tasks/2
● Invoque el comando curl para traer la tarea
número 3
curl -i
http://localhost:5000/todo/api/v1.0/tasks/3
Métodos HTTP aplicados a la aplicación
Generar una salida de error mas elegante

● Visite el archivo app.py y remueva los símbolos ‘’’


inmediatamente después de la línea que contenga la
frase
# INICIO - codigo comentado 3
y antes de la línea
# FIN - codigo comentado 3
● Invoque el comando curl para traer la tarea número 3
curl -i
http://localhost:5000/todo/api/v1.0/tasks/3
Permitir la inserción de una nueva tarea

● Visite el archivo app.py y remueva los símbolos ‘’’


inmediatamente después de la línea que contenga la
frase
# INICIO - codigo comentado 4
y antes de la línea
# FIN - codigo comentado 4
Comentarios
● Observe que el URL (/todo/api/v1.0/tasks) no
cambió pero si el método con el que se invoca ya no es
GET sino que ahora es POST
● En este método (create_task()) se valida que la
invocación al método venga acompañado de unos
datos de tipo json (request.json). Después se crea
una tarea en formato json y se adiciona a las tareas que
hay en el sistema
Invocación del nuevo método
● curl -i -H "Content-Type: application/json"
-X POST -d '{"title": "read a book"}'
http://localhost:5000/todo/api/v1.0/tasks
● Observe que a través de curl se indica que tipo de
solicitud es (application/json), el método a ser
invocado (POST) y el cuerpo de la solicitud en formato
json ({"title": "read a book"})
Interactuando con la aplicación
● Ejecute los siguientes comandos
curl -i http://localhost:5000/todo/api/v1.0/tasks

curl -i -H "Content-Type: application/json" -X POST -d


'{"title": "read a book"}'
http://localhost:5000/todo/api/v1.0/tasks

curl -i http://localhost:5000/todo/api/v1.0/tasks
Métodos HTTP aplicados a la aplicación
Los métodos finales, actualizar y borrar

● Visite el archivo app.py y remueva los símbolos ‘’’


inmediatamente después de la línea que contenga la
frase
# INICIO - codigo comentado 5
y antes de la línea
# FIN - codigo comentado 5
Interactuando con la aplicación
● Ejecute el siguiente comando para hacer la
actualización
curl -i -H "Content-Type: application/json" -X PUT -d
'{"done":true}' http://localhost:5000/todo/api/v1.0/tasks/2
¿Cómo sería el comando ‘curl’ para borrar una
tarea?
Métodos HTTP aplicados a la aplicación
Referencias
● http://blog.miguelgrinberg.com/post/designin
g-a-restful-api-with-python-and-flask
● Otros ejemplos en Flask
○ https://github.com/josanabr/dockerflask
○ https://github.com/josanabr/RESTMonitoring
Web services - WWW
● WWW nace de la idea de crear una base de
conocimiento internacional y debería ser
fácil de acceder
● Se descubrió el potencial de la web en
Internet pero se requería aún hacer trabajo
Kahoot
Como los web services ayudan en
e-business

● Brinda un entorno estandarizado para la comunicación.


Otras tecnologías lo intentaron: RPC, CORBA, COM
● Los web services unifican los mensajes tanto para
enviar datos como para ejecutar procedimientos
remotamente
● Lenguajes que describen los procedimientos permiten
que su ejecución sea automatizada

También podría gustarte