我想创建一个包含多个可选参数的路由,通过URL中存在“关键字”进行检测,并按任意顺序进行处理。
示例:
http://localhost:3000/service1/param1/value1/param2/value2
http://localhost:3000/service1/param2/value2/param4/value4/param1/value1
这甚至可能吗?我可以看到组合一个宏来创建路线,但这至少会创建一个路由因子。通话时间可能达到1 /小时,因此我可以处理缓慢的响应时间。但是使用宏为7个可选参数创建5,000个路由是否合理?
答案 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"}