Подробно о промежуточном ПО Ring
Узнайте, как промежуточное ПО Ring оборачивает обработчики, добавляя сквозное поведение — например, журналирование, разбор параметров и работу с сеансами — в веб-приложениях Compojure.
«Подробно о промежуточном ПО Ring» — бесплатный урок Clojure Functional Programming & JVM Backend Development на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Clojure Functional Programming & JVM Backend Development, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Clojure Functional Programming & JVM Backend Development содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
What Is Middleware?
In Ring, a handler is a function that takes a request map and returns a response map. Middleware is a higher-order function that takes a handler and returns a new handler.
This lets you wrap behavior around your core logic without modifying it.
(defn wrap-example [handler]
(fn [request]
(handler request)))The Wrapping Pattern
Every middleware follows the same shape: receive a handler, return a function that takes a request. You can act before or after calling the inner handler.
- Before: inspect or modify the request
- After: inspect or modify the response
(defn wrap-logging [handler]
(fn [request]
(println "Incoming:" (:uri request))
(let [response (handler request)]
(println "Status:" (:status response))
response)))Applying Middleware
You apply middleware by calling it on your handler. The result is a new handler that you pass to the server.
(def app
(-> handler
wrap-logging))The Threading Macro
The -> threading macro is the idiomatic way to stack middleware. Each layer wraps the one before it.
Order matters: the last middleware listed is the outermost layer that sees the request first.
(def app
(-> routes
wrap-params
wrap-session
wrap-logging))Built-in Middleware
The ring-defaults library bundles common middleware so you do not write it by hand.
- wrap-params parses query and form params
- wrap-session manages sessions
- wrap-keyword-params turns string keys into keywords
(require '[ring.middleware.defaults :refer [wrap-defaults site-defaults]])
(def app
(wrap-defaults routes site-defaults))Modifying the Request
To add data for downstream handlers, assoc a key onto the request before calling the inner handler.
(defn wrap-user [handler]
(fn [request]
(let [user (lookup-user (:session request))]
(handler (assoc request :current-user user)))))Modifying the Response
To set headers or transform output, work on the response after calling the inner handler.
(defn wrap-content-type [handler]
(fn [request]
(let [response (handler request)]
(assoc-in response [:headers "Content-Type"] "text/html"))))Conditional Middleware
Sometimes you only want middleware on certain routes. You can apply it selectively rather than globally.
(defroutes app
(GET "/public" [] public-handler)
(-> (GET "/admin" [] admin-handler)
wrap-authentication))Exception Handling Middleware
A common pattern is wrapping all handlers in a try/catch to return a clean 500 response instead of leaking stack traces.
(defn wrap-errors [handler]
(fn [request]
(try
(handler request)
(catch Exception e
{:status 500 :body "Internal Server Error"}))))Order of Execution
Think of middleware as an onion. The request travels inward through each layer to the handler, then the response travels outward back through them.
- Outermost middleware runs first on request, last on response
- Innermost runs last on request, first on response
; request: wrap-logging -> wrap-session -> wrap-params -> handler
; response: handler -> wrap-params -> wrap-session -> wrap-loggingComposing Reusable Middleware
Because middleware are just functions, you can group them into a single composed function and reuse it across multiple apps.
(defn wrap-common [handler]
(-> handler
wrap-logging
wrap-errors
wrap-params))Quick Check
Test your understanding of middleware ordering.
Recap
You learned that middleware are higher-order functions wrapping handlers to add cross-cutting behavior.
- They can modify the request before, or the response after
- The
->macro stacks them like an onion - Libraries like
ring-defaultsbundle common ones
Next you can combine custom middleware with Compojure routes for full-featured apps.
Часто задаваемые вопросы
Урок «Подробно о промежуточном ПО Ring» бесплатный?
Да — полный текст урока «Подробно о промежуточном ПО Ring» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Clojure Functional Programming & JVM Backend Development, подпишись на CoddyKit PRO. Курс Clojure Functional Programming & JVM Backend Development содержит 4 уроков всего.
Чему я научусь в уроке «Подробно о промежуточном ПО Ring»?
Узнайте, как промежуточное ПО Ring оборачивает обработчики, добавляя сквозное поведение — например, журналирование, разбор параметров и работу с сеансами — в веб-приложениях Compojure. Ты практикуешь Clojure Functional Programming & JVM Backend Development с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Clojure Functional Programming & JVM Backend Development?
Предыдущий опыт не требуется. Clojure Functional Programming & JVM Backend Development на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Подробно о промежуточном ПО Ring»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Clojure Functional Programming & JVM Backend Development?
Да. Каждый урок Clojure Functional Programming & JVM Backend Development включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Введение в Ring и основы HTTP
- Маршрутизация с Compojure
- Обработка запросов и ответов
- Подробно о промежуточном ПО Ring