Luminus / Compojure路线中有多个可选参数?

时间:2014-05-12 16:50:14

标签: clojure routing routes compojure luminus

我想创建一个包含多个可选参数的路由,通过URL中存在“关键字”进行检测,并按任意顺序进行处理。

示例:

http://localhost:3000/service1/param1/value1/param2/value2
http://localhost:3000/service1/param2/value2/param4/value4/param1/value1

这甚至可能吗?我可以看到组合一个宏来创建路线,但这至少会创建一个路由因子。通话时间可能达到1 /小时,因此我可以处理缓慢的响应时间。但是使用宏为7个可选参数创建5,000个路由是否合理?

1 个答案:

答案 0 :(得分:1)

您需要自己编写或生成自定义处理函数,该函数将uri字符串解析为参数,将它们排序为正确的顺序并使用它们调用目标处理程序。

由于您正在使用响铃,因此可以在响铃请求地图中的键:uri下找到uri字符串。

Compojure不能用于发送,因为它不是按照您想要的方式工作。

这是一个简化的示例,其中使用已解析参数的散列图调用目标处理程序以说明该想法:

(defn handle
  [{:keys [uri] :as request}]
  (let [[root & more] (keep not-empty (clojure.string/split uri #"/")]
    (if (= "service1" root)
      (->> more
           (partition 2)
           (reduce (fn [acc [k v]]
                     (assoc acc
                       (keyword k) v) ;; TODO: parse value if necessary
                     )
                   {})
           ;; TODO: invoke your handler fn here
           )
      ;; TODO: invoke compojure handler for other routes with request here
      )))

(handle {:uri "/service1/param2/value2/param4/value4/param1/value1"})
;; {:param1 "value1", :param4 "value4", :param2 "value2"}