2012-09-11 5 views
2

두 입력을받는 처리기 함수를 만들고 싶습니다. 하나는 URL /name에서 가져온 매개 변수이며, 두 번째는 그러나 나는 단지 하나를 통과하고, 핸들러가 2 PARAMS을 기대하고 있기 때문에 /name?x=3콧수염 처리기에서 요청 맵에 액세스/전달하는 방법

(def my-app (app 
       [page-name] (handler page-name))) 

(defn handler 
    [{:keys [params]} page-name] 
    (let [x (params "x")] 
    (-> (page-templ page-name x) response constantly))) 

은 위의 실패 쿼리 문자열에서 PARAM입니다.

요청 맵을 어떻게 가져 와서 처리기로 전달합니까?

상기 요청 맵에는 x이라는 매개 변수가 포함되어 있습니다.

답변

1

당신이처럼 페이지 이름을 파견 할 수 있다면 그것은 가장 좋습니다 :

(app 
[""] (index-page) 
["login"] (serve-login)) 
다음

기능 인덱스 페이지를 봉사 - 로그인 리턴 기능을 하나 개의 인수의.

(defn index-page[] 
    (fn [req] ..)) 

req는 키/값 맵에있는 모든 url 매개 변수를 포함 할 요청입니다. 얻으려면 매개 변수 값은이 작업을 수행 :

(-> req (get :params) (get :x)) 

그래서 전체 솔루션은 다음과 같이 보일 것입니다 :

(def my-app (app 
       ["page1-name"] (handler))) 

(defn handler [] 
    (fn [req] 
    (let [x (-> req :params :x)] 
     (-> (page-templ page-name x) response)))) 

편집 :은 (랩 키워드 PARAMS에 당신이 응용 프로그램을 포장하는 것을 잊지 마세요) 및 (wrap-params)의 경우 다음을 수행 할 수 있습니다.

(def my-wrapped-app 
    (-> my-app 
    (wrap-keyword-params) 
    (wrap-params)) 
+1

응답이 요청에 의존하는 경우 계속해서 사용하면 안됩니다. ** 끊임없이 ** 요청에 무관심한 응답을 신속하게 반환하는데 사용됩니다. 매개 변수의 유무에 상관하지 않습니다. –

+1

대답 주셔서 감사합니다, 그것은 대단히 도움이되었습니다. 이제 모든 함수를 위의 방식으로 정의하고 있습니다. 그러나 나는 wrap-keyword-params 작업을 수행 할 수 없습니다. 나는 여전히 문자열 키를 얻는다. 내 코드를 https://github.com/murtaza52/hs-ex에 게시했습니다. – murtaza52

+1

죄송합니다. 웹 응용 프로그램을 실행할 수 없지만 앱 매크로 내에 래퍼를 지정하면 주문을 취소해야한다고 생각합니다. (app (wrap-params) (wrap-keyword-params) [ ""] (serve-index)) –

관련 문제