Capítulo 1, Básico
O que é uma API e por que FastAPI
Uma API é um contrato entre quem pede e quem responde. O FastAPI transforma esse contrato, escrito como tipos Python, em validação, conversão e documentação automáticas.
O que é uma API
Quando um aplicativo mostra a sua lista de pedidos, ele não tem os pedidos. Ele pergunta a um servidor, que consulta um banco de dados e responde. Essa pergunta e essa resposta seguem um contrato: qual endereço chamar, com qual verbo, com quais dados, e o que volta. Esse contrato é a API (Application Programming Interface).
Quase toda API da web fala HTTP. Uma requisição tem um verbo, um caminho, cabeçalhos e, às vezes, um corpo. A resposta tem um código de status, cabeçalhos e, em geral, um corpo em JSON:
POST /produtos HTTP/1.1
Host: api.exemplo.com
Content-Type: application/json
{"nome": "Caneta", "preco": 3.5}
HTTP/1.1 201 Created
Content-Type: application/json
{"id": 7, "nome": "Caneta", "preco": 3.5}
Os quatro verbos que formam o CRUD são a base de quase tudo que você vai construir:
| Operação | Verbo HTTP | Para que serve | Sucesso típico |
|---|---|---|---|
| Create | POST | Criar um recurso novo | 201 Created |
| Read | GET | Ler, sem alterar nada | 200 OK |
| Update | PUT ou PATCH | Substituir ou alterar parte de um recurso | 200 OK |
| Delete | DELETE | Remover um recurso | 204 No Content |
O que é o FastAPI
O FastAPI é um framework web para Python. Ele é construído sobre duas bibliotecas: o Starlette, que cuida de HTTP, rotas e middleware, e o Pydantic, que cuida de validar e converter dados. A ideia central dele é que a anotação de tipo é a fonte da verdade: você escreve idade: int uma vez, e o FastAPI usa isso para converter a entrada, recusar o que for inválido e descrever o parâmetro na documentação.
from fastapi import FastAPI
app = FastAPI(title="Loja", version="1.0")
@app.get("/produtos")
def listar_produtos():
return ["caneta", "caderno"]
documento = app.openapi()
print(documento["openapi"])
print(list(documento["paths"]))
print(documento["info"]["title"], documento["info"]["version"])
3.1.0
['/produtos']
Loja 1.0
O app.openapi() devolve a descrição completa da API no formato OpenAPI, um padrão da indústria. Nós não escrevemos nada disso: o FastAPI a montou a partir da rota e dos tipos. É esse documento que alimenta a página /docs (Swagger UI) e a /redoc, e que outras ferramentas usam para gerar clientes e testes.
FastAPI, Django e Flask
Os três resolvem problemas diferentes, e escolher entre eles não é uma questão de "qual é mais rápido":
| FastAPI | Django | Flask | |
|---|---|---|---|
| Foco | APIs, com dados validados por tipos | Aplicações completas (admin, ORM, autenticação, templates) | Aplicações pequenas e flexíveis |
| Validação de entrada | Automática, pelos tipos | Formulários e serializers (Django REST Framework) | Manual ou por extensões |
| Documentação interativa | Automática (OpenAPI) | Por extensões | Por extensões |
| Código assíncrono | Nativo (async def) | Suportado em views e no ASGI | Suportado em views, com limitações |
Um erro comum de materiais antigos é dizer que Django e Flask "não têm suporte a async". Hoje ambos têm algum, em graus diferentes. O que o FastAPI oferece é uma forma de escrever o código assíncrono desde o início e a validação integrada. Para um sistema grande com painel administrativo e muitas telas, o Django continua sendo uma ótima escolha. Para uma API que serve um aplicativo ou outros serviços, o FastAPI costuma ser o caminho mais curto.
Os dois recursos que mais pesam
Validação automática. Se o cliente mandar um texto onde você pediu um número, o FastAPI responde com um erro 422 explicando qual campo falhou. Você não escreve nenhum if.
Documentação automática. Ao abrir /docs, você vê todas as rotas, os campos de cada uma e um botão para testar a rota ali mesmo. Durante o desenvolvimento, isso substitui o Postman na maior parte do tempo.
Documentação não é só para você
O documento OpenAPI é lido por máquinas. Times de frontend geram clientes tipados a partir dele, e ferramentas de teste geram casos de teste. Quanto mais fiel for a sua anotação de tipo, mais útil ele é.
Exercício 1
Qual verbo, qual status?
Escreva verbo_e_status(acao), que receba "criar", "ler", "atualizar" ou "remover" e devolva o par (verbo, status de sucesso típico) da tabela acima. Para "atualizar", use PUT.