有没有办法让compojure自动支持类型转换?
Is there some way to let compojure support type conversion automatically?
现在可以这样使用compojure:
(GET ["/uri"] [para1 para2]
)
Para1 和 para2 都是 String 类型。
我想让它正确地知道类型,像这样:
(GET ["/uri"] [^String para1 ^Integer para2]
)
可以将para1转为Sting,para2转为Integer。
是否有一些库或好的方法可以做到这一点?
这目前不可能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¶2=3" :request-method :get})
{:status 200,
:headers {"Content-Type" "text/html; charset=utf-8"},
:body "{:k1 \"a\", :k2 4}"}
从 Compojure 1.4.0 开始可以使用语法 [x :<< as-int]
现在可以这样使用compojure:
(GET ["/uri"] [para1 para2]
)
Para1 和 para2 都是 String 类型。
我想让它正确地知道类型,像这样:
(GET ["/uri"] [^String para1 ^Integer para2]
)
可以将para1转为Sting,para2转为Integer。
是否有一些库或好的方法可以做到这一点?
这目前不可能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¶2=3" :request-method :get})
{:status 200,
:headers {"Content-Type" "text/html; charset=utf-8"},
:body "{:k1 \"a\", :k2 4}"}
从 Compojure 1.4.0 开始可以使用语法 [x :<< as-int]