1

我有一个具有以下路线的 clojure / compojure webapp

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

预览 GET 请求由几个参数组成。我发现这在大多数情况下都有效,但有时找不到 /ebook/preview 并且处理下降到 ANY 路由,在这种情况下输出类似于此,

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

谁能建议什么可能导致 /ebook/preview 请求被跳过?这绝对是一个 GET 请求;HTML 没有 /app/preview URL 的 POST,并且可以确保我为 /app/preview 添加了 POST 路由并且没有被命中。

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}))
4

2 回答 2

2

如果您试图找出导致问题的请求,请停止丢弃请求映射,(request :params)只需查看request. 这将为您提供一张包含 Compojure 拥有的所有信息的地图;您可以检查它,并稍后将其传递回您的路线以观察发生了什么(例如,在您进行一些更改之后)。

于 2011-12-12T07:43:09.307 回答
0

如果

(my-preview-function request)

返回 nil,则路由将尝试下一条路由。查看(源 GET)并查看它如何匹配(或不匹配)您的路线。

于 2014-05-10T11:07:26.140 回答