2014-05-12 59 views
0

我想創建一個具有多個可選參數的路由,通過URL中「關鍵字」的存在進行檢測,並以任意順序處理。Luminus/Compojure路由中有多個可選參數?

例子:

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

這甚至可能嗎?我可以看到將一個宏組合起來創建路線,但是這會創建至少一個路線因子。通話時間可能會達到1個小時,所以我可以處理響應時間慢的問題。但是使用宏爲7個可選參數創建5000條路由是否合理?

+0

你可以平凡看看路徑和解析參數1 /值1 /參數2 /值2 ..放入地圖{:param1 value1,:param2 value2 ...} –

回答

1

您需要編寫或生成一個自定義處理函數,該函數將uri字符串解析爲參數,並將它們按正確的順序排序並用它們調用目標處理程序。

由於您正在使用戒指,所以可以在戒指請求地圖中的鑰匙: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"}