【发布时间】:2012-04-02 11:39:54
【问题描述】:
在 Clojure / Compojure 中,如何将映射转换为 URL 查询字符串?
{:foo 1 :bar 2 :baz 3}
到
foo=1&bar=2&baz=3
在 compojure 中是否有任何实用方法可以做到这一点?
【问题讨论】:
在 Clojure / Compojure 中,如何将映射转换为 URL 查询字符串?
{:foo 1 :bar 2 :baz 3}
到
foo=1&bar=2&baz=3
在 compojure 中是否有任何实用方法可以做到这一点?
【问题讨论】:
类似:
(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>
【讨论】:
java.net.URLEncoder.encode,即(for [[k v] m] (str (name k) "=" (java.net.URLEncoder/encode v)))。
(hiccup.util/url "/hello" {:a 1 :b 2}) => "/hello?a=1&b=2"。如果你不想仅仅为单个实用函数添加对 Hiccup 的依赖,那么自己编写函数真的没什么大不了的。
是的,已经有一个不涉及 Hiccup 或滚动您自己的 string/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,所以你已经拥有了。
【讨论】:
(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"
【讨论】: