compojure deroutes - маршрут иногда не распознается

У меня есть веб-приложение clojure/compojure со следующими маршрутами

(defroutes my-routes
 (GET "/app/preview" request  (my-preview-function request))
 (ANY "*" request (str "ANY page <br>" (request :params))))

Предварительный запрос GET выполняется с несколькими параметрами. Я нахожу, что это работает большую часть времени, но иногда /ebook/preview не найден, и обработка падает на ЛЮБОЙ маршрут, и в этом случае вывод похож на этот,

ANY page 
{:* "/app/preview", :section "50", :id "48"}

Кто-нибудь может подсказать, что может привести к пропуску запроса /ebook/preview? Это определенно GET-запрос; в HTML нет POST для URL-адреса /app/preview, и, чтобы быть вдвойне уверенным, я добавил маршрут POST для /app/preview, и он не был поражен.

JAR-версии:

Clojure 1.2
compojure-0.6.2
ring-core-0.3.7
jetty-6.1.14
ring-jetty-adapter-0.3.1
ring-servlet-0.3.1jar
servlet-api-2.5-6.1.14

Маршруты завернуты следующим образом

(require '[compojure.handler :as handler])

(defn wrap-charset [handler charset]
  (fn [request]
    (if-let [response (handler request)]
      (if-let [content-type (get-in response [:headers "Content-Type"])]
        (if (.contains content-type "charset")
          response
          (assoc-in response
            [:headers "Content-Type"]
            (str content-type "; charset=" charset)))
        response))))

(def app (-> my-routes
           handler/site
           wrap-stateful-session
           (wrap-charset "utf-8")
           (wrap-file "public")))

(defn run []
  (run-jetty (var app) {:join? false :port 8080}))

person Teflon Mac    schedule 12.12.2011    source источник


Ответы (2)


Если вы пытаетесь выяснить, какой запрос вызывает проблемы, перестаньте выбрасывать карту запросов с (request :params) и просто взгляните на request. Это даст вам карту со всей информацией, которой располагает Compojure; вы можете проверить его и передать его обратно в свои маршруты позже, чтобы посмотреть, что произойдет (скажем, после того, как вы внесете некоторые изменения).

person amalloy    schedule 12.12.2011
comment
Спасибо. Это хорошее предложение. Все еще не очень приятно выяснять, почему правильный маршрут не подбирается, но я отвечу, если разработаю его. - person Teflon Mac; 20.12.2011

If

(my-preview-function request)

возвращает nil, тогда маршрутизация попытается использовать следующий маршрут. Взгляните на (источник GET) и посмотрите, насколько он соответствует (или не соответствует) вашему маршруту.

person pete23    schedule 10.05.2014