Как настроить родные маршруты Pedestal таким образом, чтобы все были доступны при использовании: ограничений?

Я создаю игрушечный сервис Pedestal, предназначенный для следующих ресурсов:

  • /
  • /movies
  • /movies/today
  • /movies/:iso-date где :iso-date Матчи ####-##-##

Ограничение для последнего маршрута определяется следующим фрагментом:

^:constraints {:iso-date #"\d{4}-\d{2}-\d{2}"}

Всякий раз, когда маршрут, содержащий это ограничение, присутствует в таблице маршрутов, я не могу получить его родной маршрут /movies/today; вместо этого я получаю ответ "Не найдено". Когда маршрут, имеющий ограничение, удаляется, GET /movies/today преуспевает.

Маршруты постамента, которые я определил в кратком формате, выглядят так:

(defroutes routes
  [[["/" {:get root-page}
     ["/movies" ^:interceptors [fetch-movies]
      {:get movies-page}
      ["/today" {:get movies-for-today-page}]
      ["/:iso-date" ^:constraints {:iso-date #"\d{4}-\d{2}-\d{2}"}
       {:get movies-for-date-page}]]]]])

Правильно ли я построил эту таблицу маршрутов, чтобы добиться желаемого поведения при маршрутизации?

NB. Печать скомпилированных маршрутов дает мне результат, который я ожидаю, так как все маршруты присутствуют :path-re регулярные выражения соответствуют ожиданиям в REPL:

({:path-parts [""],
  :path-params [],
  :interceptors
  [{:name :foobar.service/root-page,
    :enter
    #object[io.pedestal.interceptor.helpers$before$fn__7359 0x14501070 "io.pedestal.interceptor.helpers$before$fn__7359@14501070"],
    :leave nil,
    :error nil}],
  :path "/",
  :method :get,
  :path-re #"/\Q\E",
  :route-name :foobar.service/root-page}
 {:path-parts ["" "movies"],
  :path-params [],
  :interceptors
  [{:name :foobar.service/fetch-movies,
    :enter
    #object[io.pedestal.interceptor.helpers$on_request$fn__7401 0x2aa85cc4 "io.pedestal.interceptor.helpers$on_request$fn__7401@2aa85cc4"],
    :leave nil,
    :error nil}
   {:name :foobar.service/movies-page,
    :enter
    #object[io.pedestal.interceptor.helpers$before$fn__7359 0x30ffc3c0 "io.pedestal.interceptor.helpers$before$fn__7359@30ffc3c0"],
    :leave nil,
    :error nil}],
  :path "/movies",
  :method :get,
  :path-re #"/\Qmovies\E",
  :route-name :foobar.service/movies-page}
 {:path-parts ["" "movies" "today"],
  :path-params [],
  :interceptors
  [{:name :foobar.service/fetch-movies,
    :enter
    #object[io.pedestal.interceptor.helpers$on_request$fn__7401 0x2aa85cc4 "io.pedestal.interceptor.helpers$on_request$fn__7401@2aa85cc4"],
    :leave nil,
    :error nil}
   {:name :foobar.service/movies-for-today-page,
    :enter
    #object[io.pedestal.interceptor.helpers$before$fn__7359 0x3726fc3b "io.pedestal.interceptor.helpers$before$fn__7359@3726fc3b"],
    :leave nil,
    :error nil}],
  :path "/movies/today",
  :method :get,
  :path-re #"/\Qmovies\E/\Qtoday\E",
  :route-name :foobar.service/movies-for-today-page}
 {:path-parts ["" "movies" :iso-date],
  :path-params [:iso-date],
  :interceptors
  [{:name :foobar.service/fetch-movies,
    :enter
    #object[io.pedestal.interceptor.helpers$on_request$fn__7401 0x2aa85cc4 "io.pedestal.interceptor.helpers$on_request$fn__7401@2aa85cc4"],
    :leave nil,
    :error nil}
   {:name :foobar.service/movies-for-date-page,
    :enter
    #object[io.pedestal.interceptor.helpers$before$fn__7359 0x93fb20b "io.pedestal.interceptor.helpers$before$fn__7359@93fb20b"],
    :leave nil,
    :error nil}],
  :path "/movies/:iso-date",
  :path-constraints {:iso-date "(\\d{4}-\\d{2}-\\d{2})"},
  :query-constraints {},
  :method :get,
  :path-re #"/\Qmovies\E/(\d{4}-\d{2}-\d{2})",
  :route-name :foobar.service/movies-for-date-page})

1 ответ

Решение

Я решил эту проблему в пьедестале версии 0.4.1-SNAPSHOT.

(io.pedestal.http.route/router my-routes :linear-search)

использование :linear-search, вместо :prefix-tree,

Другие вопросы по тегам