Обслуживание приложений и 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 с ЛЮБОЙ "*" и т. д.

Я подозреваю, что здесь есть что-то тонкое, что я упускаю, и, хотя мой подход, кажется, работает, это приведет к неожиданному поведению или результатам в некоторых ситуациях и т. Д.

Ответы на вопрос(2)

Ваш ответ на вопрос