Я новичок в Clojure и использовал Compojure для написания базового веб-приложения. Тем не менее, я нажимаю на стену с синтаксисом Compojure defroutes
, и я думаю, что мне нужно понять как "как", так и "почему" за всем этим.
Кажется, что приложение Ring-style начинается с карты запросов HTTP, а затем просто передает запрос через ряд функций промежуточного программного обеспечения, пока оно не будет преобразовано в карту ответа, которая будет отправлена обратно в браузер. Этот стиль выглядит слишком "низкоуровневым" для разработчиков, поэтому нужен такой инструмент, как Compojure. Я вижу эту потребность в дополнительных абстракциях в других программных экосистемах, в первую очередь с Python WSGI.
Проблема в том, что я не понимаю подход Compojure. Возьмем следующее defroutes
S-выражение:
(defroutes main-routes
(GET "/" [] (workbench))
(POST "/save" {form-params :form-params} (str form-params))
(GET "/test" [& more] (str "<pre>" more "</pre>"))
(GET ["/:filename" :filename #".*"] [filename]
(response/file-response filename {:root "./static"}))
(ANY "*" [] "<h1>Page not found.</h1>"))
Я знаю, что ключ к пониманию всего этого лежит в каком-то макро-вуду, но я не совсем понимаю макросы (пока). Я долго смотрел на источник defroutes
, но просто не понимаю! Что здесь происходит? Понимание "большой идеи", вероятно, поможет мне ответить на эти конкретные вопросы:
- Как мне получить доступ к среде Ring из маршрутизируемой функции (например, функция
workbench
)? Например, скажем, я хотел получить доступ к заголовкам HTTP_ACCEPT или какой-либо другой части запроса/промежуточного программного обеспечения? - Какая сделка с деструктурированием (
{form-params :form-params}
)? Какие ключевые слова доступны для меня при деструкции?
Мне очень нравится Clojure, но я настолько тупой!