Como criar e hospedar uma API usando Deno?
Cansado da complexidade de gerenciar ambientes virtuais, arquivos de dependências e processos de build para criar uma simples API? Se você busca uma abordagem mais moderna, segura e direta para o desenvolvimento em back-end, está na hora de conhecer o Deno.
Neste artigo, vamos transformar uma API de consulta a concursos públicos, originalmente escrita em Python com FastAPI, em uma aplicação Deno. E o melhor: vamos hospedá-la gratuitamente na nuvem com a plataforma oficial, o Deno Deploy, em questão de minutos.
O Que Vamos Construir?
Criaremos uma API RESTful que:
- Realiza web scraping no site
concursosnobrasil.com
para obter dados sobre concursos públicos. - Oferece um endpoint dinâmico, como
/sp
, para consultar os concursos por estado. - Mantém os dados em um cache interno, que é atualizado periodicamente para garantir performance e informações recentes.
- Separa a resposta em "concursos abertos" e "concursos previstos".
Pré-requisitos
A simplicidade do Deno brilha aqui. Você só precisa de uma coisa:
- Deno instalado: Visite o site oficial deno.land para instruções de instalação.
E é isso. Sem pip
, sem venv
, sem requirements.txt
.
Passo 1: Estruturando o Servidor com Oak
Assim como o FastAPI é para o Python, o Oak é um dos frameworks mais populares para criar aplicações web com Deno. Ele é inspirado no Koa.js e torna a criação de rotas e o gerenciamento de requisições uma tarefa simples.
Para começar, importamos o Application
e o Router
diretamente de uma URL:
// main.ts
import { Application, Router } from "https://deno.land/x/[email protected]/mod.ts";
const app = new Application();
const router = new Router();
// Nossas rotas irão aqui...
app.use(router.routes());
app.use(router.allowedMethods());
console.log("Servidor ouvindo na porta 8000");
await app.listen({ port: 8000 });
A beleza do Deno é que ele baixa e armazena essas dependências em cache na primeira execução.
Passo 2: Coletando os Dados (Web Scraping)
No projeto original em Python, as bibliotecas httpx
e beautifulsoup4
foram usadas para buscar e processar o HTML. No Deno, podemos alcançar o mesmo resultado com ferramentas nativas e uma biblioteca da comunidade.
Usamos o fetch
, que já vem embutido no Deno, para fazer a requisição HTTP. Para o parsing do HTML, importamos o deno-dom
:
// main.ts
import { DOMParser } from "https://deno.land/x/[email protected]/deno-dom-wasm.ts";
async function fetchAndExtractData(uf: string) {
const url = `https://concursosnobrasil.com/concursos/${uf}/`;
const response = await fetch(url);
const text = await response.text();
const doc = new DOMParser().parseFromString(text, "text/html");
const table = doc?.querySelector("table");
// ...lógica para extrair dados da tabela...
return []; // Retorna os dados extraídos
}
Passo 3: Criando os Endpoints da API
Com os dados em mãos, definimos os endpoints. A rota principal (/
) servirá uma página HTML com a documentação, e a rota /:state_uf
retornará o JSON dos concursos.
// main.ts
// Rota para a documentação
router.get("/", (ctx) => {
ctx.response.type = "html";
ctx.response.body = `<html>... Documentação da API ...</html>`;
});
// Rota que retorna os dados de um estado
router.get("/:state_uf", (ctx) => {
const { state_uf } = ctx.params;
const data = concursosData[state_uf.toLowerCase()];
// ...lógica para separar abertos e previstos...
ctx.response.body = {
// ...objeto JSON com os dados...
};
});
Passo 4: Cache e Atualização Periódica
Para evitar sobrecarregar o site-alvo e garantir respostas rápidas, não fazemos o scraping a cada requisição. Em vez disso, armazenamos os dados em uma variável e a atualizamos em intervalos regulares. O asyncio.create_task
da versão Python é substituído pelo simples setInterval
do JavaScript.
const concursosData: Record<string, any[]> = {};
async function periodicUpdateTask() {
console.log("Iniciando atualização dos dados...");
// Lógica para chamar fetchAndExtractData para todas as UFs
// e preencher o objeto 'concursosData'.
}
// Executa a primeira carga de dados ao iniciar
periodicUpdateTask();
// Agenda a atualização para rodar a cada 1 hora (3600 * 1000 ms)
setInterval(periodicUpdateTask, 3600 * 1000);
Passo 5: Hospedagem com Deno Deploy
Agora, a mágica final. Com o código pronto em um arquivo main.ts
, como fazemos o deploy?
- Envie para o GitHub: Crie um repositório e envie seu arquivo
main.ts
. - Acesse o Deno Deploy: Faça login em deno.com/deploy com sua conta do GitHub.
- Crie um Projeto: Clique em "New Project", selecione seu repositório, e o Deno Deploy automaticamente identificará o arquivo
main.ts
. - Clique em "Link": Em segundos, sua API estará online, rodando em uma infraestrutura global e com uma URL
*.deno.dev
.
É simples assim. Sem contêineres, sem configuração de servidor, sem arquivos YAML complexos.
Migrar uma ideia do ecossistema Python para o Deno revela uma nova forma de pensar o desenvolvimento de back-end: focado na simplicidade, segurança por padrão e com ferramentas modernas integradas. Com o Deno e o Deno Deploy, o caminho entre escrever o código e vê-lo funcionando na nuvem nunca foi tão curto e direto. Experimente!
Minha API: https://concursos-api.deno.dev/
Escrito para meu blog: https://jeielmiranda.is-a.dev/jeiel-blog/