У меня есть приложение 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))))
Обратите внимание, что существует больше промежуточного программного обеспечения, чем показано здесь.
Единственное "ограничение", с которым я столкнулся, заключается в том, что, поскольку в маршрутах приложения есть маршрут, не найденный, он должен быть последним, или он будет запущен, прежде чем найти маршруты api.
Это кажется более простым и гибким, чем некоторые другие решения, которые я нашел, которые, как представляется, используют дополнительное условное промежуточное программное обеспечение, такое как ring.middleware.conditional или то, что мне кажется более сложным определением маршрутизации, где есть дополнительный слой defroutes и необходимость определять defroutes с ЛЮБОЙ "*" и т.д.
Я подозреваю, что есть что-то тонкое, которого я здесь не вижу, и, хотя мой подход, похоже, работает, это приведет к неожиданному поведению или результатам в некоторых ситуациях и т.д.