Executando verificação de segurança...
2

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?

  1. Envie para o GitHub: Crie um repositório e envie seu arquivo main.ts.
  2. Acesse o Deno Deploy: Faça login em deno.com/deploy com sua conta do GitHub.
  3. Crie um Projeto: Clique em "New Project", selecione seu repositório, e o Deno Deploy automaticamente identificará o arquivo main.ts.
  4. 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/

Carregando publicação patrocinada...