2

我想创建一个接受两个输入的处理函数。一个是从 url 获取的参数/name,第二个是来自查询字符串的参数/name?x=3

(def my-app (app
               [page-name] (handler page-name)))

(defn handler
  [{:keys [params]} page-name]
  (let [x (params "x")]
    (-> (page-templ page-name x) response constantly)))

上面的失败是因为处理程序需要 2 个参数,但是我只传递了一个。

如何获取请求映射并将其传递给处理程序?

上述案例中的请求映射包含一个名为x.

4

1 回答 1

1

最好可以在页面名称上发送,如下所示:

(app
 [""] (index-page)
 ["login"] (serve-login))

这里函数 index-page 和 serve-login 返回一个参数的函数。

(defn index-page[]
  (fn [req] ..))

req 是将包含键/值映射中所有 url 参数的请求。要获取参数值,请执行以下操作:

(-> req (get :params) (get :x))

所以完整的解决方案看起来像这样:

(def my-app (app
               ["page1-name"] (handler)))

(defn handler []
  (fn [req]
    (let [x (-> req :params :x)]
      (-> (page-templ page-name x) response))))

编辑:不要忘记将您的应用程序包装到 (wrap-keyword-params) 和 (wrap-params) 中,您可以这样做:

(def my-wrapped-app
  (-> my-app
   (wrap-keyword-params)
   (wrap-params))
于 2012-09-11T11:27:47.470 回答