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

Clojure Luminus/Compojure路由中有多个可选参数?,clojure,routing,routes,compojure,luminus,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次,所以我可以处理响应时间慢的问题。但是,使用

我想创建一个路由,它有多个可选参数,通过URL中的“关键字”来检测,并以任意顺序进行处理

示例:

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

这可能吗?我可以看到组合一个宏来创建路由,但这至少会创建路由的阶乘。电话每小时可能会接通1次,所以我可以处理响应时间慢的问题。但是,使用宏为7个可选参数创建5000条路由是否合理?

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

由于您使用的是ring,因此可以在ring请求映射中的键
:uri
下找到uri字符串

Compojure不能用于分派,因为它不是按您希望的方式设计的

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

(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"}

您可以简单地查看路径并解析param1/value1/param2/value2。。进入一个映射{:param1 value1,:param2 value2…}