Como Criar uma API REST: Design, Segurança e Deploy
Para criar uma API REST, liste os recursos que seu app gerencia (usuários, pedidos, reservas), dê a cada um uma URL como /pedidos e /pedidos/{id}, e use métodos HTTP para as ações: GET para ler, POST para criar, PATCH para atualizar e DELETE para remover. Retorne JSON com códigos de status que façam sentido, valide cada entrada, exija autenticação e verificação de permissão por registro no servidor, e pagine as listas. Depois, documente os endpoints e publique a API atrás de HTTPS.
Este guia cobre as decisões de design, um conjunto de rotas de exemplo, prompts para um criador de apps com IA e os erros que causam falhas de segurança. Se APIs são novidade para você, comece com o que é uma API.
Quando você precisa de uma API REST
- O frontend do seu site precisa salvar e carregar dados de um servidor
- Um app mobile, um parceiro ou uma ferramenta de automação precisa acessar seus dados
- Outros serviços enviam eventos para você (webhooks)
- Você divide o trabalho entre uma equipe de frontend e uma de backend
REST é o estilo mais comum, mas não é o único. REST vs GraphQL explica quando um único endpoint de consulta flexível é mais indicado.
Comece pelo design: recursos e rotas
Anote os substantivos do seu app e o que as pessoas fazem com eles. Para um app simples de reservas:
| Método | Rota | O que faz | Código de sucesso |
|---|---|---|---|
GET | /api/reservas | Lista as reservas de quem chama (paginado) | 200 |
POST | /api/reservas | Cria uma reserva | 201 |
GET | /api/reservas/{id} | Retorna uma reserva | 200 |
PATCH | /api/reservas/{id} | Altera alguns campos | 200 |
DELETE | /api/reservas/{id} | Cancela uma reserva | 204 |
GET | /api/health | Verificação de saúde para monitoramento | 200 |
Essas rotas correspondem a criar, ler, atualizar e excluir; veja o que é CRUD. Convenções que vale seguir:
- Substantivos no plural e sem verbos nas URLs:
/reservas, e não/getReservas. - Aninhe só um nível quando isso deixar a relação de posse clara:
/reservas/{id}/observacoes. - Ações que não são CRUD podem ser sub-recursos:
POST /reservas/{id}/cancelaré mais claro do que um PATCH disfarçado. - Nomes consistentes para os campos, como
created_atem todos os lugares.
Códigos de status e erros
Use os códigos HTTP padrão para que o cliente saiba o que aconteceu sem precisar interpretar texto:
| Código | Significado | Use quando |
|---|---|---|
| 200 | OK | Leitura ou atualização bem-sucedida |
| 201 | Created | Um POST criou algo |
| 204 | No Content | Sucesso sem nada para retornar |
| 400 | Bad Request | A entrada falhou na validação |
| 401 | Unauthorized | Não está logado ou o token é inválido |
| 403 | Forbidden | Está logado, mas não tem permissão |
| 404 | Not Found | Não existe, ou quem chama não pode saber que existe |
| 409 | Conflict | Duplicidade, ou o horário já foi reservado |
| 429 | Too Many Requests | Limite de requisições atingido |
| 500 | Server Error | Algo quebrou do seu lado |
Retorne os erros em um formato JSON único e consistente, por exemplo {"error": {"code": "slot_taken", "message": "Esse horário não está mais disponível."}}, e nunca inclua stack traces nem erros de banco de dados nas respostas.
Opções e trade-offs
| Decisão | Escolha simples | Alternativa |
|---|---|---|
| Onde a API fica | Rotas de API dentro do seu framework web | Um serviço de API separado, útil para vários clientes ou outra linguagem |
| Autenticação | Cookies de sessão para o seu app web | Tokens (bearer tokens ou chaves de API) para apps mobile e terceiros |
| Paginação | ?page=2&limit=20 | Baseada em cursor (?after=...), mais estável para listas grandes e que mudam |
| Versionamento | Nenhum até ter usuários externos | /v1/ no caminho quando outros dependerem da API |
| Documentação | Um README com as rotas | Uma especificação OpenAPI, que ferramentas transformam em docs interativas e código de cliente |
Passo a passo
- Liste os recursos e as rotas como acima, incluindo quem pode chamar cada uma.
- Modele os dados no seu banco, com os campos e relacionamentos que você precisa.
- Crie primeiro as rotas de leitura, depois as de criação, atualização e exclusão.
- Valide a entrada em toda escrita com uma biblioteca de schema: campos obrigatórios, tipos, tamanhos, valores permitidos. Rejeite campos desconhecidos.
- Adicione autenticação e, depois, autorização por registro: buscar
/reservas/42precisa verificar que a reserva 42 pertence a quem chama, e não apenas que alguém está logado. - Pagine todas as listas e limite o tamanho da página.
- Limite a quantidade de requisições no login e nas rotas mais pesadas. Veja limitação de requisições.
- Configure CORS apenas se navegadores de outros domínios precisarem chamar a API, e liste essas origens explicitamente. Como corrigir erros de CORS explica os erros que você vai encontrar.
- Escreva documentação e testes para cada rota, incluindo os casos de falha.
- Faça o deploy com segredos em variáveis de ambiente, HTTPS, logs e uma verificação de saúde.
Prompts para o seu criador de apps com IA
Estrutura inicial:
Crie uma API REST para reservas com estas rotas: GET /api/health, GET /api/reservas (paginado, máximo de 50 por página), POST /api/reservas, GET /api/reservas/:id, PATCH /api/reservas/:id, DELETE /api/reservas/:id. Armazene os dados no nosso banco. Valide o corpo das requisições com uma biblioteca de schema e rejeite campos desconhecidos. Retorne erros em JSON no formato {"error": {"code", "message"}} com os códigos de status corretos (400, 401, 403, 404, 409). Mantenha os segredos em variáveis de ambiente.
Segurança:
Exija login em todas as rotas de reservas. Em cada leitura, atualização e exclusão, verifique no servidor se a reserva pertence ao usuário atual; retorne 404 se não pertencer. Nunca aceite IDs de usuário nem perfis vindos do corpo da requisição. Limite POST /api/reservas a 20 por minuto por usuário. Registre os erros no servidor sem retornar stack traces.
Documentação:
Escreva uma descrição OpenAPI dessas rotas e um README curto com exemplos de requisições e respostas para cada uma.
Testando sua API
Teste a partir de fora do frontend, porque atacantes vão fazer isso:
- Cada rota funciona com entradas válidas e retorna o formato e o código documentados
- Campos ausentes ou inválidos retornam 400 com uma mensagem clara
- Sem token, toda rota protegida retorna 401
- O usuário A pedindo o registro do usuário B pelo ID recebe 404 ou 403
- As listas são paginadas; um
limitmuito grande é limitado - Criações duplicadas ou conflitantes retornam 409, e não 500
- Os limites de requisição retornam 429
- As respostas de erro não contêm stack traces, SQL nem segredos
- O CORS libera apenas as origens que você pretende
Erros comuns
- Verificar o login, mas não a posse do registro. A falha mais comum em APIs: qualquer usuário logado lê qualquer registro trocando o ID.
- Confiar no cliente. Preços, perfis e IDs de usuário enviados no corpo da requisição podem ser alterados.
- Retornar linhas inteiras do banco. Hashes de senha e campos internos vazam. Escolha o que cada resposta inclui.
- Listas sem limite. Uma requisição para todos os registros pode deixar o app inteiro lento.
200 OKcom uma mensagem de erro dentro. Clientes e monitoramento não conseguem saber que falhou.- CORS configurado para liberar tudo em uma API que usa cookies.
- Sem verificação de saúde nem logs, então você descobre as quedas pelos usuários.
Para uma revisão mais ampla antes do lançamento, veja a checklist de segurança para apps criados com IA.
Criando uma API REST no Mythex
Você pode pedir ao Mythex uma API como parte do seu app ou como um serviço próprio. A receita REST API backend da documentação tem um prompt inicial: informe o framework e as rotas, peça erros claros em JSON, mantenha os segredos em variáveis de ambiente e inclua um Dockerfile. Backends em contêiner feitos em Node, Python, C#, Java e outras linguagens são publicados por meio de um Dockerfile, e o Mythex cuida do deploy a partir de Publicar (backends de API). Um projeto pode rodar um site e um servidor de API lado a lado, e você alterna entre eles na pré-visualização. Guarde as chaves como segredos do projeto e, se a API precisar de um banco de dados, peça um no chat. Para tarefas agendadas em torno da sua API, veja como executar jobs em segundo plano.
Perguntas
O que é uma API REST?
Uma API REST é uma forma de programas trabalharem com os dados do seu app pela internet, usando HTTP. Cada tipo de dado é um recurso com URL própria, como /pedidos, e métodos padrão agem sobre ele: GET para ler, POST para criar, PATCH ou PUT para atualizar e DELETE para remover. Os dados costumam ser enviados em JSON.
Em qual linguagem devo criar uma API REST?
Use a que você ou sua equipe consegue manter. Node.js com Express ou Fastify, Python com FastAPI, e frameworks em C# ou Java funcionam bem. As regras de design para rotas, códigos de status, validação e autenticação importam mais do que a linguagem.
Como proteger uma API REST?
Exija autenticação em todas as rotas que não são públicas, verifique no servidor se quem chama pode acessar cada registro específico, valide todas as entradas, use HTTPS, limite a quantidade de requisições e guarde os segredos em variáveis de ambiente. Nunca confie em IDs ou perfis de usuário enviados pelo cliente.
Preciso de um backend separado para uma API REST?
Nem sempre. Frameworks como o Next.js conseguem servir rotas de API junto com as páginas. Um serviço de API separado faz sentido quando vários clientes (web, mobile, parceiros) usam a mesma API, ou quando ela precisa de outra linguagem ou de escalabilidade própria.