2015-01-17 3 views
0

Теперь можно использовать compojure таким образом:Есть ли способ автоматического преобразования типа поддержки compojure?

(GET ["/uri"] [para1 para2] 
    ) 

para1 и para2 все типа String.

Я хотел бы, чтобы это знать тип correcttly, как это:

(GET ["/uri"] [^String para1 ^Integer para2] 
    ) 

Она может конвертировать para1 быть Стинг и para2 к Integer.

Есть ли какая-нибудь библиотека или хороший способ сделать это?

ответ

0

В настоящее время это невозможно with only Compojure.

Вы можете использовать Prismatic schema coercion.

(require '[schema.core :as s]) 
(require '[schema.coerce :as c]) 
(require '[compojure.core :refer :all]) 
(require '[ring.middleware.params :as rparams]) 

(def data {:para1 s/Str :para2 s/Int s/Any s/Any}) 
(def data-coercer (c/coercer data c/string-coercion-matcher)) 

(def get-uri 
    (GET "/uri" r 
     (let [{:keys [para1 para2]} (data-coercer (:params r))] 
       (pr-str {:k1 para1 :k2 (inc para2)})))) 

(def get-uri-wrapped 
    (let [keywordizer (fn [h] 
         (fn [r] 
         (h (update-in r [:params] #(clojure.walk/keywordize-keys %)))))] 
    (-> get-uri keywordizer rparams/wrap-params))) 

Вот пример работы:

(get-uri-wrapped {:uri "/uri" :query-string "para1=a&para2=3" :request-method :get}) 

{:status 200, 
:headers {"Content-Type" "text/html; charset=utf-8"}, 
:body "{:k1 \"a\", :k2 4}"}