# Criação da API ## Considerações Iniciais: Este tutorial fez uso dos seguintes parâmetros: **Sistema Operacional:** Arch Linux x86_64 **Kernel:** 6.1.6-arch1-1 **Linguagem:** Python 3.11 **Framework**: Flask 2.2 ## Configuração do Ambiente: Inicialmente, é aconselhável criar um ambiente virtual utilizando-se do módulo venv presente no python: ```shell python3.11 -m venv venv ``` Em seguida, é necessário ativá-lo: ```shell source venv/bin/activate ``` Caso deseje desativar, é apenas necessário escrever: ```shell deactivate ``` Em seguida é necessário instalar o framework flask: > Essa instalação é feita a partir do pip, o gerenciador de pacotes python. ``` pip install flask flask_restful ``` Pronto, agora já temos tudo o que é necessário para criar a aplicação. ## Criando a API: > O exemplo a ser demonstrado será de um ToDo list, algo bem simples, contudo bem informativo. Inicialmente iremos importar as bibliotecas necessárias, além de instânciar o objeto Flask, informando-o o nome do arquivo onde está o código, juntamente a isso, também instânciamos a API e, por fim, preenchemos um pequeno conjunto de de tarefas: ```python from flask import Flask from flask_restful import reqparse, abort, Api, Resource app = Flask(__name__) api = Api(app) TODOS = { "todo1": {"task": "Fazer Tutorial"}, "todo2": {"task": "Fazer Arquitetura"}, "todo3": {"task": "Estudar para prova"}, "todo4": {"task": "Fazer atividades"}, } ``` Após isso, criaremos a classe responsável por responder as requisições para pegar uma tarefa, atualizá-la ou deletá-la: ```python def abort_if_todo_doesnt_exist(todo_id): if todo_id not in TODOS: abort(404, message=f"Todo {todo_id} doesn't exist") class Todo(Resource): def get(self, todo_id): abort_if_todo_doesnt_exist(todo_id) return TODOS[todo_id] def delete(self, todo_id): abort_if_todo_doesnt_exist(todo_id) del TODOS[todo_id] return "", 204 def put(self, todo_id): args = parser.parse_args() task = {"task": args["task"]} TODOS[todo_id] = task return task, 201 ``` E em seguida associamos um *EndPoint* a essa classe e configuramos o código para rodar a aplicação ao executarmos o arquivo com o interpretador: ```python api.add_resource(Todo, "/todo/<todo_id>") if __name__ == "__main__": app.run(debug=True) ``` Agora vamos executar: ![](https://i.imgur.com/eJL2p38.png) Bom, agora a aplicação está rodando no endereço `http://127.0.0.1:5000` e para acessá-lo com os verbos HTTP iremos utilizar o **curl**, o qual é um projeto de software de computador que fornece uma biblioteca e uma ferramenta de linha de comando para transferir dados usando vários protocolos: Primeiramente usaremos o verbo GET: ![](https://i.imgur.com/CNkH1fA.png) O verbo PUT: ![](https://i.imgur.com/QLvmAnd.png) Agora se olharmos novamente o "todo3", encontraremos outra atividade. ![](https://i.imgur.com/PMpDT8M.png) Por fim, agora usaremos o verbo DELETE: ![](https://i.imgur.com/axayu2m.png) Bom agora com isso feito precisamos conseguir adicionar ou listar todas as tarefas, assim como numa API REST. Para isso criaremos outra classe e a associaremos a outro *EndPoint*: ```python class TodoList(Resource): def get(self): return TODOS def post(self): args = parser.parse_args() todo_id = int(max(TODOS.keys()).lstrip("todo")) + 1 todo_id = "todo%i" % todo_id TODOS[todo_id] = {"task": args["task"]} return TODOS[todo_id], 201 api.add_resource(TodoList, "/todos") ``` Agora usaremos o verbo GET, para pegar todas as tarefas: ![](https://i.imgur.com/z0jmnAX.png) Agora adicionaremos mais uma tarefa com o verbo POST: ![](https://i.imgur.com/jWqgxjX.png) E agora se usarmos o GET novamente, a tarefa estará lá: ![](https://i.imgur.com/evIRva0.png) ![](https://i.imgur.com/O1zwskG.png) Pronto, agora temos uma API que podemos adicionar, remover, atualizar e ver tarefas.