Introdução e criação de uma API com FastAPI
Tags: fastapi, python, api, microservicos
Published: 2020-11-30 15:25:42

## O quê é FastAPI?
FastAPI é um framework python moderno, rápido (alta performance) para desenvolvimento de API's com Python 3.6+, e baseado em _type hints_ do Python. Seu criador o define como: 

**_"Framework de alta performance, fácil de aprender, codificar e fazer seu deploy."_**

Para contextualizar, é interessante comentar quais são as outras ferramentas desse "segmento", as mais populares:
- Django REST Framework
- Flask

A intenção desse post é mostrar um pouco desse framework python, e também mostrar como é simples criar uma API com FastAPI.
<br>

## Características do FastAPI:
- Performance: Extremamente eficiente, comparável com NodeJS e Go (graças ao _Starlette_, e o _Pydantic_). [Um dos frameworks mais performáticos em Python disponível](https://github.com/tiangolo/blog-posts/tree/master/introducing-fastapi#performance)
- Intuitivo: Suporte ideal pelo editor/IDE. Orientado aos _type hints_ faz com quê o _code complete_ seja perfeito.
- Debug: Menor tempo de debug, devido ao suporte do _code complete_, e do traceback.
- Baseado em padrões: Baseado e compatível com os padrões abertos para API'S: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) e [JSON Schema](http://json-schema.org/)
- SwaggerUI: Uma interface de documentação interativa para APIs.
- ReDoc: Alternativa ao SwaggerUI.
- Entre outros..

## Criando um ambiente virtual
Você também pode utilizar outro gerenciador de pacotes/dependências em Python, como o [Poetry](https://python-poetry.org/), mas nessa introdução usarei o pip.
### Linux e MacOS
```sh
python3 -m venv venv
source venv/bin/activate
```
### Windows
```sh
python -m venv venv
./venv/Scripts/activate
```
_Lembre-se que você precisa ter configurado o Windows para executar scripts remotos, ou a politica de execução de scripts. [saiba mais.](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.1)_

## Instalação
```sh
pip install fastapi
```
Você também precisará de um servidor [ASGI](https://asgi.readthedocs.io/en/latest/):
```sh
pip install uvicorn
```

## Criando a API
Agora que o ambiente está configurado, e as dependências instaladas, _it's time to code!_

- Crie um arquivo `main.py`:
```python
from fastapi import FastAPI

app = FastAPI()

@app.get('/')
def say():
  return {"message": "Hello World!"}
```

## Iniciando a aplicação:
Com o uvicorn instalado:
```sh
uvicorn main:app --reload
```
>**main** = módulo/arquivo do python
>**:** = separador, indica que usará alguma variável/função/classe/objeto
>**app** = objeto de instância do FastAPI
>**--reload** = função do uvicorn para escutar alterações no código e reiniciar a aplicação.

## Resultados:
### Web:
![Requisição feita através do Postman](https://dev-to-uploads.s3.amazonaws.com/i/08a3mvy9b8j9so1n76hg.png)

## Documentação
### SwaggerUI:
![Página do SwaggerUI](https://dev-to-uploads.s3.amazonaws.com/i/4bj4x9ua9e03hzb40i8h.png)
**Podemos executar as requisições através dessa página, como no exemplo abaixo:**<br>
![Página do SwaggerUI, com a requisição de teste executada](https://dev-to-uploads.s3.amazonaws.com/i/9bro05u37m8y91hr2snc.png)
### ReDoc:
![Página do ReDoc](https://dev-to-uploads.s3.amazonaws.com/i/kgsuw9753nba4xp7v9o8.png)

## Observações finais
FastAPI é um framework extremamente **leve**, **rápido** e **fácil**. O deploy é muito simples, e as IDEs/Editores de texto fornecem ao máximo o _code complete_ pra ajudar o desenvolvedor a se virar.

Com FastAPI podemos customizar quase toda a página de documentação de forma automática, podemos determinar as models de retorno no JSON Schema e o FastAPI fará automaticamente a validação dos dados, retornando erro caso haja alguma diferença.

That's it! É claro que o exemplo acima não é nada comparado ao que o framework oferece, mas tentarei trazer conteúdos que irão abranger todo o ecossistema desse framework. 

## Saiba mais
- [Repositório do FastAPI](https://github.com/tiangolo/fastapi)
- [Documentação do FastAPI](https://fastapi.tiangolo.com/)

## Referências
- [FastAPI](https://fastapi.tiangolo.com/)
- [Introducing FastAPI](https://medium.com/@tiangolo/introducing-fastapi-fdc1206d453f)

*Notou o* ***Fast****API* * em negrito? Eu entendi a referência.*