Objetivos de aprendizado
Depois de ler este artigo, você vai conseguir:
- Entender os princípios que fazem uma API ser REST
- Escolher o método HTTP e o código de status certos para cada operação
- Criar e testar uma API REST mínima em Node.js com curl
Nesta página
- Como uma API REST funciona?
- Quais são os princípios do REST?
- Quais métodos HTTP usar para cada ação?
- Como desenhar URLs e códigos de status?
- Como é um exemplo de API REST em Node.js?
- Quando uma API REST não é a melhor escolha?
- Qual a diferença entre REST, RESTful e outros termos?
- Como fazer isso na Square Cloud
- Perguntas frequentes
Quase todo app que você usa conversa com um servidor por uma API. O app de clima pede a previsão, o painel de um bot lista servidores, o site de uma loja cria um pedido. Na maioria dos casos, essa conversa segue o estilo REST.
REST não é um protocolo nem uma biblioteca. É um conjunto de regras de projeto, descrito por Roy Fielding em sua tese de doutorado, em 2000, e hoje aplicado sobre o HTTP. Entender essas regras ajuda tanto a consumir APIs quanto a desenhar a sua.
Como uma API REST funciona?#
O cliente (um app, um navegador, um bot) envia uma requisição HTTP para uma URL. O servidor processa e devolve uma resposta com um código de status e, normalmente, um corpo em JSON.
curl -i https://api.exemplo.com/livros/1HTTP/1.1 200 OK
Content-Type: application/json
{"id": 1, "titulo": "Dom Casmurro"}A requisição tem três partes que importam: o método (o que fazer), a URL (em qual recurso) e, às vezes, um corpo com dados. A resposta devolve o status (deu certo ou não) e a representação do recurso, geralmente JSON.
Quais são os princípios do REST?#
Fielding descreve REST como um conjunto de restrições arquiteturais:
- Cliente e servidor separados: a interface do usuário e o armazenamento de dados evoluem de forma independente.
- Sem estado (stateless): cada requisição carrega tudo o que o servidor precisa, como o token de autenticação. O servidor não guarda sessão entre chamadas.
- Cache: a resposta indica se pode ser reaproveitada, o que reduz tráfego.
- Interface uniforme: recursos identificados por URL, manipulados por representações, com mensagens que se descrevem sozinhas e links entre recursos (hipermídia).
- Sistema em camadas: entre o cliente e o servidor pode haver proxies, CDNs e balanceadores, e o cliente não percebe.
- Código sob demanda (opcional): o servidor pode enviar código executável ao cliente.
Na prática, a maioria das APIs "REST" implementa bem as primeiras ideias e ignora a hipermídia. Funciona, e é isso que você vai encontrar no dia a dia.
Quais métodos HTTP usar para cada ação?#
Os métodos são definidos na RFC 9110. Dois conceitos ajudam a escolher: um método é seguro quando não altera nada no servidor, e idempotente quando repetir a chamada produz o mesmo efeito de chamar uma vez.
| Método | Ação típica | Seguro | Idempotente |
|---|---|---|---|
| GET | Ler um recurso ou uma lista | Sim | Sim |
| POST | Criar um recurso | Não | Não |
| PUT | Substituir um recurso inteiro | Não | Sim |
| PATCH | Alterar parte de um recurso | Não | Não necessariamente |
| DELETE | Remover um recurso | Não | Sim |
A idempotência importa quando a rede falha. Se um DELETE /livros/1 estoura o tempo limite, você pode repetir sem medo. Repetir um POST pode criar dois registros.
Como desenhar URLs e códigos de status?#
URLs nomeiam coisas, não ações. O método já diz a ação.
- Bom:
GET /livros,GET /livros/1,POST /livros,DELETE /livros/1. - Ruim:
GET /buscarLivro?id=1,POST /deletarLivro.
Use o plural para coleções e aninhe só quando a relação for clara, como /autores/3/livros. Os códigos de status mais usados:
| Código | Quando usar |
|---|---|
| 200 OK | Leitura ou atualização que deu certo |
| 201 Created | Recurso criado (envie o cabeçalho Location com a nova URL) |
| 204 No Content | Deu certo e não há corpo, comum em DELETE |
| 400 Bad Request | Dados inválidos enviados pelo cliente |
| 401 Unauthorized | Sem credenciais ou credenciais inválidas |
| 404 Not Found | O recurso não existe |
| 409 Conflict | Conflito com o estado atual, como um registro duplicado |
| 500 Internal Server Error | Falha inesperada no servidor |
Devolver 200 com {"erro": true} no corpo é um erro comum: quebra clientes, caches e ferramentas de monitoramento que olham só o status.
Como é um exemplo de API REST em Node.js?#
Com uma versão recente do Node.js, instale o Express 5 e crie o server.mjs:
npm install express@5import express from "express";
const app = express();
app.use(express.json());
const livros = [{ id: 1, titulo: "Dom Casmurro" }];
let proximoId = 2;
app.get("/livros", (_req, res) => res.json(livros));
app.get("/livros/:id", (req, res) => {
const livro = livros.find((l) => l.id === Number(req.params.id));
if (!livro) return res.status(404).json({ erro: "Livro não encontrado" });
res.json(livro);
});
app.post("/livros", (req, res) => {
const { titulo } = req.body ?? {};
if (typeof titulo !== "string" || titulo === "") {
return res.status(400).json({ erro: "titulo é obrigatório" });
}
const livro = { id: proximoId++, titulo };
livros.push(livro);
res.status(201).location(`/livros/${livro.id}`).json(livro);
});
app.delete("/livros/:id", (req, res) => {
const i = livros.findIndex((l) => l.id === Number(req.params.id));
if (i === -1) return res.status(404).json({ erro: "Livro não encontrado" });
livros.splice(i, 1);
res.sendStatus(204);
});
app.listen(process.env.PORT ?? 3000);Rode com node server.mjs e teste:
curl -i localhost:3000/livros/1
curl -i -X POST localhost:3000/livros -H "Content-Type: application/json" -d '{"titulo":"Quincas Borba"}'
curl -i -X DELETE localhost:3000/livros/2
curl -i localhost:3000/livros/99As respostas esperadas são 200, 201, 204 e 404. Os dados ficam em memória e somem ao reiniciar; numa API real, use um banco de dados. Antes de publicar, passe pela checklist de API em produção.
Quando uma API REST não é a melhor escolha?#
REST funciona bem para operações de pedido e resposta sobre recursos. Em outros cenários, ele deixa a desejar:
- Tempo real: chat, jogos e cotações pedem uma conexão aberta. Veja o que é um WebSocket.
- Telas que precisam de dados de vários recursos: encadear várias chamadas deixa a tela lenta, e o GraphQL permite pedir tudo numa só.
- Ações que não são CRUD: "aprovar pedido" nem sempre cabe bem em um recurso. Um
POST /pedidos/5/aprovacaocostuma resolver.
Não existe um vencedor universal. REST é a escolha mais comum porque é simples, usa o que o HTTP já oferece e qualquer linguagem consegue consumir.
Qual a diferença entre REST, RESTful e outros termos?#
- RESTful: uma API que segue o estilo REST.
- HTTP API: termo mais neutro, usado quando a API usa HTTP mas não segue todas as restrições.
- RPC: chamadas de função remotas, como
POST /criarPedido. Ações no lugar de recursos. - Webhook: o caminho inverso, em que o servidor chama uma URL sua quando algo acontece.
Para colocar a sua no ar, veja como hospedar uma API.
Como fazer isso na Square Cloud#
Uma API REST é uma aplicação que escuta em uma porta e responde a requisições HTTP, então o exemplo acima roda como qualquer app Node.js. Você faz o deploy enviando um ZIP pelo painel, pela CLI, pelo GitHub ou pela extensão do VS Code, e cada aplicação web ganha um subdomínio *.squareweb.app com HTTPS.
O arquivo de configuração squarecloud.app é opcional: o painel o gera no deploy, com runtime, memória e arquivo principal. Uma aplicação web precisa de pelo menos 512 MB da RAM do seu plano. Há runtimes para Node.js, Python, Go, Java, PHP e outros. Todos os planos incluem tráfego sem cobrança por banda ou por requisição (política de uso justo), proteção DDoS e WAF. Se a API usar banco, a hospedagem de PostgreSQL, MySQL, MongoDB e Redis começa no plano Standard.
A própria Square Cloud tem uma API REST (api.squarecloud.app/v2), com SDKs oficiais em JavaScript/TypeScript, Python e Go. Para publicar a sua, veja a página de hospedagem de APIs.
Hospedagem de APIs
APIs em containers sempre ligados, sem cold start
Perguntas frequentes
Qual a diferença entre API e API REST?
API é qualquer interface que permite a um programa falar com outro. API REST é um tipo específico, que usa HTTP, URLs para recursos e requisições sem estado.
API REST e API RESTful são a mesma coisa?
Na prática, sim. RESTful é só o adjetivo para uma API que segue o estilo REST. Muitas APIs chamadas de REST seguem só parte das regras.
REST usa sempre JSON?
Não. JSON é o formato mais comum, mas REST não obriga nenhum. O cliente e o servidor combinam o formato pelos cabeçalhos Accept (o que o cliente aceita receber) e Content-Type (o formato enviado).
Qual a diferença entre REST e GraphQL?
Em REST há várias URLs, uma por recurso, e o servidor define o formato da resposta. Em GraphQL há um único endpoint e o cliente escolhe os campos que quer receber.
Uma API REST precisa de HTTPS?
Se ela carrega tokens ou dados de usuários, sim. Sem HTTPS, credenciais e dados trafegam em texto puro e podem ser lidos no caminho.
Mais em APIs
Ver todos os 15 artigos- Como hospedar uma APIHospedar uma API é rodar o servidor HTTP 24 horas num lugar com IP público e HTTPS. Veja o passo a passo com Node.js e Python, testes e erros comuns.
- Como hospedar uma aplicação Node.jsPara hospedar uma aplicação Node.js, prepare o package.json, leia porta e segredos do ambiente, escolha uma versão LTS e rode com node. Veja o passo a passo.
- Como hospedar FastAPI, Flask ou DjangoPara hospedar FastAPI, Flask ou Django, rode a aplicação com um servidor de produção (Uvicorn ou Gunicorn) em 0.0.0.0. Veja comandos, ajustes do Django e erros.
- Como hospedar um script ou API em PythonPara hospedar um script ou API em Python, fixe a versão, isole dependências em um venv, leia segredos do ambiente e trate o SIGTERM. Passo a passo com código.