0

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

例子:

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

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

4

1 回答 1

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"}
于 2014-05-12T18:35:43.873 回答