Objetivo: Fazer um servidor web subir, rodar na sua máquina e responder "Hello, World!" quando acessado por uma URL. Isso prova que nossa configuração base está correta.
deps.edn (A "Lista de Compras" do Backend)O que é o deps.edn?
Pense neste arquivo como a "lista de compras" do seu projeto. Ele diz ao Clojure (clj) quais bibliotecas (dependências) de terceiros ele precisa baixar da internet para o seu projeto funcionar.
Ele também define "apelidos" (aliases), que são atalhos para comandos que usamos com frequência, como "rodar o servidor".
Ação:
Crie o arquivo deps.edn na raiz do seu projeto (todo-app/) e cole o seguinte conteúdo nele:
{:paths ["src" "resources"] ;; 1. Onde nosso código-fonte vai ficar
:deps ;; 2. Nossa "lista de compras" de bibliotecas
{;; O próprio Clojure
org.clojure/clojure {:mvn/version "1.11.1"}
;; --- Dependências do Backend (API REST) ---
;; O "motor" do servidor web (Jetty) e as bibliotecas base do Ring
ring/ring-core {:mvn/version "1.12.2"}
ring/ring-jetty-adapter {:mvn/version "1.12.2"}
;; A biblioteca de roteamento (para definir as URLs)
metosin/reitit-ring {:mvn/version "0.7.0"}
}
:aliases ;; 3. Nossos "atalhos" de comando
{;; O alias que usaremos para iniciar o servidor
:run
{:main-opts ["-m" "todo.backend.core"]}
}
}
:paths: Dissemos ao Clojure para procurar nosso código-fonte nas pastas src e resources (que ainda vamos criar).:deps: Pedimos apenas as bibliotecas essenciais do backend.
ring/ring-jetty-adapter: Este é o software do servidor web que vai "ouvir" na localhost:3000.metosin/reitit-ring: Este é o "roteador" que vai olhar a URL (ex: /api/hello) e decidir qual função Clojure deve ser chamada.shadow-cljs ou reagent. Faremos isso só na Fase 3, para manter nosso backend limpo.:aliases: Criamos um atalho :run. Quando rodarmos clj -M:run, ele saberá que deve procurar e executar a função principal (-main) no namespace todo.backend.core (que vamos criar a seguir).Agora que temos nossa "lista de compras", o próximo passo é criar o código que ela fará funcionar. Vamos criar nossa primeira função handler.
Pronto para o Passo 1.2: Criar o Handler Mínimo (handler.clj)?
Perfeito. Agora vamos escrever a primeira "peça" da nossa lógica de backend.
handler.clj)O que é um "Handler"?
No mundo do Ring (a biblioteca base da web em Clojure), um "Handler" é simplesmente uma função que segue um contrato:
request (um mapa Clojure com todos os dados da requisição HTTP que chegou).response (um mapa Clojure que descreve a resposta que queremos enviar de volta).Nosso objetivo é criar a função hello-handler mais simples possível.