如何在Clojure / Compojure / Ring中将地图转换为URL查询字符串?

时间:2012-03-16 22:59:10

标签: clojure compojure ring

在Clojure / Compojure中,如何将地图转换为URL查询字符串?

{:foo 1 :bar 2 :baz 3}

foo=1&bar=2&baz=3

在compojure中有没有任何实用方法呢?

3 个答案:

答案 0 :(得分:19)

是的,有一个实用程序已经没有涉及打嗝或滚动你自己的字符串/ join / URLEncoder函数:

user=> (ring.util.codec/form-encode {:foo 1 :bar 2 :baz 3})
"foo=1&bar=2&baz=3"
user=>

Compojure取决于ring / ring-core,包括ring.util.codec,所以你已经拥有它。

答案 1 :(得分:7)

类似的东西:

(defn params->query-string [m]
     (clojure.string/join "&" (for [[k v] m] (str (name k) "=" v))))

应该这样做......

REPL会议:

user> (defn params->query-string [m]
         (clojure.string/join "&" 
            (for [[k v] m] 
               (str (name k) "="  (java.net.URLEncoder/encode v)))))
#'user/params->query-string
user> (params->query-string {:foo 1 :bar 2 :baz 3})
"foo=1&bar=2&baz=3"
user> 

答案 2 :(得分:0)

(defn to-query [inmap]
    (->> inmap
       (map (fn [[f s]] (str (name f) "=" (java.net.URLEncoder/encode (str s) "UTF-8"))))
       (clojure.string/join '&)
       ))

此代码从关键字中删除了“:”,但是如果关键字是数字,则会抛出异常。

(to-query {:foo 1 :bar 2 :baz 3})
=> "foo=1&bar=2&baz=3"