Обслуживание приложений и API-маршрутов с различными промежуточными программами с использованием Ring и Compojure
У меня есть приложение ring + compojure, и я хочу применить другое промежуточное ПО в зависимости от того, является ли маршрут частью веб-приложения или частью API (который основан на json).
Я нашел несколько ответов на этот вопрос о переполнении стека и других форумах, но эти ответы кажутся более сложными, чем решение, которое я использовал. Я хотел знать, есть ли недостатки в том, как я это делаю, и что мне может не хватать в моем решении. Очень упрощенная версия того, что я делаю,
(defroutes app-routes
(GET "/" [req] dump-req)
(route/not-found "Not Found"))
(defroutes api-routes
(GET "/api" [req] dump-req))
(def app
(routes (-> api-routes
(wrap-defaults api-defaults))
(-> app-routes
(wrap-defaults site-defaults))))
Обратите внимание, что промежуточного программного обеспечения больше, чем я показал здесь.
Единственное «ограничение», с которым я столкнулся, заключается в том, что, поскольку у app-route есть маршрут not-found, он должен быть последним, или он будет запущен до нахождения маршрутов API.
Это кажется более простым и более гибким, чем некоторые другие решения, которые я обнаружил, которые используют дополнительное условное промежуточное программное обеспечение, такое как ring.middleware.conditional, или то, что мне кажется более сложным определением маршрутизации, где есть дополнительный слой defroutes. и необходимость определить defroutes с ЛЮБОЙ "*" и т. д.
Я подозреваю, что здесь есть что-то тонкое, что я упускаю, и, хотя мой подход, кажется, работает, это приведет к неожиданному поведению или результатам в некоторых ситуациях и т. Д.