Как использовать промежуточное ПО по умолчанию для сайта для одного набора маршрутов и api-по умолчанию для другого набора маршрутов? - PullRequest
1 голос
/ 10 ноября 2019

В обработчике моего веб-приложения Compojure / Ring мне нужно обслуживать один набор маршрутов с использованием промежуточного программного обеспечения site-defaults, а другой отдельный набор маршрутов с использованием промежуточного программного обеспечения api-defaults. Как я могу это сделать?

Приведенный ниже код обслуживает только один набор маршрутов с использованием промежуточного программного обеспечения site-defaults. Что я должен добавить, чтобы обслуживать второй набор маршрутов (api-routes), используя промежуточное ПО api-defaults?

(web-experiment.handler
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.defaults :refer [wrap-defaults
                                              site-defaults
                                              api-defaults]]
            [web-experiment.views :refer :all]))

(defroutes app-routes
  (GET "/" [] (index-page))
  (GET "/about" [] (about-page))
  (route/not-found "Not Found"))

(defroutes api-routes
  (GET "/grapefruit" [:as {body :body}] (grapefruit-api body))
  (GET "/factory" [:as {body :body}] (factory-api body))
  (GET "/umbrella" [:as {body :body}] (umbrella-api body))
  (route/not-found "Not Found"))

(def app
  (wrap-defaults app-routes site-defaults))
;; TODO: Add api-routes. How to use api-defaults middleware to serve api-routes?

Я прочитал это:

Ответы [ 3 ]

0 голосов
/ 11 ноября 2019

Вы можете просто обернуть некоторые из ваших маршрутов в одну оболочку, а некоторые другие в другую оболочку. Вам просто нужно организовать свои маршруты немного по-другому.

Некоторое время назад я написал демо, что вы можете сделать с кольцевыми маршрутами. Вы можете найти его в https://github.com/ska2342/ring-routes-demo/

В частности, часть, начинающаяся с строка 70 демо, должна быть вам интересна.

0 голосов
/ 15 ноября 2019

Можете ли вы попробовать:

(defroutes app-routes
  (GET "/"      [] (index-page))
  (GET "/about" [] (about-page))
  (route/not-found "Not Found"))

(defroutes api-routes
  (GET "/grapefruit" [:as {body :body}] (grapefruit-api body))
  (GET "/factory"    [:as {body :body}] (factory-api body))
  (GET "/umbrella"   [:as {body :body}] (umbrella-api body))
  #_(route/not-found "Not Found"))

(defroutes app
  (wrap-defaults api-routes api-defaults)
  (wrap-defaults app-routes site-defaults))
0 голосов
/ 11 ноября 2019

Я не уверен, как это можно решить в Compojure, но вы можете рассмотреть возможность использования Pedestal. Эта страница предоставляет хорошее введение в процесс сопоставления маршрутов, который происходит за до вызова любых перехватчиков (замена Pedestal для промежуточного программного обеспечения Ring).

Таким образом, вы можете определить два различных набора промежуточного программного обеспечения:

(def user-intc-chain [inject-connection auth-required (body-params/body-params)] )
(def api-intc-chain  [inject-connection auth-required api-params-intc] )

, а затем определить маршруты, например:

["/echo"   :get (conj user-intc-chain echo-intc) ] ; a "user" route
["/alive?" :get (conj api-intc-chain alive-intc) ] ; an "api" route

В дополнение к встроенным функциям Pedestal, у меня естьколичество вспомогательных и вспомогательных функций, задокументированных здесь: https://cloojure.github.io/doc/tupelo/tupelo.pedestal.html

...