# 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:

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:

O verbo PUT:

Agora se olharmos novamente o "todo3", encontraremos outra atividade.

Por fim, agora usaremos o verbo DELETE:

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:

Agora adicionaremos mais uma tarefa com o verbo POST:

E agora se usarmos o GET novamente, a tarefa estará lá:


Pronto, agora temos uma API que podemos adicionar, remover, atualizar e ver tarefas.