Piszemy nasz pierwszy REST-owy webserwis w Clojure
W artykule tym spotkamy się po raz pierwszy z Clojure. Fantastycznym nowoczesnym dialektem Lispa, działającym na JVM. Mógłbym o nim mówić w samych superlatywach.
Na to jednak będziecie musieli trochę poczekać. Z pewnością nastąpi to w jednym z najbliższych postów. Teraz bowiem będzie krótko, zwięźle, do rzeczy i technicznie.
Napiszemy najprostszy możliwy REST-owy serwis. Cóż więc innego mielibyśmy napisać, jeżeli nie sztandarowe hello world?
Clojure
Dla ułatwienia zrozumienia kodu, który pojawi się niebawem, zapoznajmy się ze składnią Clojure. A konkretnie z faktem, iż język ten opiera się na tzw. notacji polskiej, czyli prefiksowej.
Funkcje i operatory zawsze pojawiają się przed argumentami. Ponadto ujęte są w nawiasy, w następujący sposób:
Użyjemy leiningen – systemu budowania projektu i menadżera zależności dla Clojure. To taki w przybliżeniu odpowiednik mavena czy gradle.
Pozwoli on nam szybko i bezboleśnie stworzyć projekt wykorzystujący Compojure, czyli coś co wpada do kategorii routing library i pozwala na przyporzadkowanie URL-om odpowiadających funkcji Clojure.
lein new compojure clojure-hello
Po uruchomieniu powyższego powinniśmy dostac świeżo utworzony projekt, który niebawem zmodyfikujemy.
Poniższa komenda pozwoli nam na uruchomienie tegoż serwisu. Możemy takim go zostawić, będzie się on samoczynnie uaktualniał.
lein ring server
Leiningen
Polecam w tym momencie przejście szybkiego tutoriala. Oczywiście najpierw instalacja. A potem lein help tutorial. Przyda się jako, że jest to bardzo podstawowe narzedzie dla Clojure.
Pozwolę sobie tutaj wymienić kilka informacji. Niektóre z nich pojawiają się w samouczku.
Szukanie zależności
Informacje na temat np. wersji znajdziemy na clojars.org. Możemy też wyszykiwać przy pomocy Leiningen np. lein search clj-http
Checkout dependencies
Mechanizm pozwalający na sprawny devlopment więcej niż jednego projektu jednocześnie, nie musimy wtedy restartować REPL-a1
Przydatne komendy
lein repl – uruchomienie pętli REPL lein run – wywołanie kodu funkcji -main, jeżeli jest ona zdefiniowana lein test – uruchomienie testów
Znajdziemy tam także informacje, jak obchodzić się z projektem w zależnosci czy ma on byc dostarczony końcowemu użytkownikowi, udostepniony jako biblioteka, czy też uruchomiony na serwerze.
W zależności od zastosowania możemy chcieć utworzyć uberjar, dodać bibliotekę to clojars lub zbudować projekt bazując na wybranych szablonach projektów webowych, jak compojure w naszym przypadku.
Do kodu!
Nasz świeżo utworzony projekt powinien posiadać następującą strukturę:
Ten pierwszy to odpowiednik build.gradle czy też mavenowego pom.xml. Określa on zależności naszego projektu i definiuje handlera requestów. Początkowo ma on taką treść:
Na nasze potrzeby wygląda nieźle. Gorliwi mogą dodać opis i link do ich strony. Następnie zajrzymy do pliku handler.clj. Tak wygląda jego główna funkcja:
Zmodyfikujemy ją zatem tak żeby odpowiadała naszym potrzebom:
I już, wszystko powinno śmigać jak należy. W szczegóły zagłębimy się być może przy następnej okazji. A oto pełny kod handlera:
Zwiastun
W następnym odcinku spróbujemy czegoś bardziej skomplikowanego. Jak np. bazy danych i obchodzenia się z JSON-em. Stay tuned!