2014-05-12 4 views
0

여러 개의 선택적 매개 변수가있는 경로를 만들고 싶습니다. URL에 "키워드"가 있음을 감지하고 임의의 순서로 처리했습니다.Luminus/Compojure 경로에 여러 개의 선택적 매개 변수가 있습니까?

예 :

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

이도 가능합니까? 나는 경로를 만드는 매크로를 조합하는 것을 볼 수 있었지만 경로의 적어도 계승을 창출했다. 전화가 1 시간/1 시간이 될 것이므로 느린 응답 시간을 처리 할 수 ​​있습니다. 그러나 매크로를 사용하여 7 개의 선택적 매개 변수에 대해 5,000 개의 경로를 만드는 것이 합리적입니까?

+0

당신은 하찮게 경로보고 PARAM1/값 1/PARAM2/값 2를 분석 할 수 있습니다 .. 지도 {: param1 value1, : param2 value2 ...} –

답변

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