Criando uma API com Clojure

Criando o projeto e instalando as dependências

Logo Clojure

Partindo do pressuposto que você já tem o ambiente devidamente configurado(Java + leininger), vamos iniciar o projeto. Eu irei usar o compojure como opção de template na criação do projeto. Com isso, já teremos o básico para recebermos e respondermos às requisições HTTP..

lein new compojure invoice_api

Se tudo tiver ocorrido bem, o projeto irá seguir uma estrutura similar a esta:

.
├── README.md
├── project.clj
├── resources
│   └── public
├── src
│   └── invoice_api
│       └── handler.clj
├── target
│   └── .
└── test
    └── invoice_api
        └── handler_test.clj

Até aqui não tem muito segredo, se você já brincou alguma vez com lein já deve estar acostumado com essa estrutura e a principal novidade a se perceber é que não temos o arquivo o tradicional core.clj. Neste momento, vamos nos ater apenas ao arquivo handler.clj. É nele que irão ficar as funções(rotas) de entrada da API.

Neste ponto, ele deve se parecer em algo como:

(ns invoice-api.handler
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.defaults :refer [wrap-defaults site-defaults]]))

(defroutes app-routes
  (GET "/" [] "Hello World")
  (route/not-found "Not Found"))

(def app
  (wrap-defaults app-routes site-defaults))

💡 Um ponto que me surpreende no compojure é a simplicidade. Não tem muito segredo em usá-lo, por tanto, não será necessário entrar a fundo em cada detalhe.

Indo direto ao que interessa, a mágica acontece dentro da função defroutes (que é uma macro) e é onde se definem as rotas da API. Podemos pensar que aqui é ponto de entrada da API.

(defroutes app-routes
  (GET "/" [] "Hello World")
  (route/not-found "Not Found"))

Como podemos perceber, ele já criou uma rota para “/” que irá retornar uma mensagem de “Hello World”. Bora testar?

Para subir a aplicação basta executar, no diretório raiz do projeto, o comando lein ring server e isso abrirá automaticamente o navegador no endereço em que servidor estiver configurado. Geralmente na porta 3000. Você também pode usar o comando lein ring server-headles. Isso irá suprimir o comportamento de abrir o browser.

lein ring server-headless

Abrindo, manualmente, no no endereço: http://localhost:3000/

clojure-hello.png

“Supimpa”! não? 😅

Por ultimo, mas não menos importante, temos o símbolo “app”.

(def app
  (wrap-defaults app-routes site-defaults))

Aqui é onde são passadas as definições de rotas para a função wrap-defaults seguida de algumas configurações (site-defaults isso envolve encode, definições de segurança, cookies e etc.)

Bônus:

Arquivos gerados

  • project.clj → Arquivo para fazer gerenciamento de dependências [plugins e etc..] do projeto. Similar à um Gemfile, package.json e etc...
  • handlertest.clj → Arquivo de testes de handler.clj. Lembrando que no clojure a convenção adotada é o [kebab-case](https://en.wiktionary.org/wiki/kebabcase), porém, o os arquivos devem ser nomeados seguindo a convenção snake_case.
  • target→ Destino do arquivo de build.

No proxímo post

Nada de in-memory, vamos configurar o acesso ao postgres e adicionar um novo enpoint para criar invoices.

Referências

👉 compojure/wiki 👉 repositório do projeto

Comentários