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

Sat*_*ish 13 clojure compojure ring

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

{:foo 1 :bar 2 :baz 3}
Run Code Online (Sandbox Code Playgroud)

foo=1&bar=2&baz=3
Run Code Online (Sandbox Code Playgroud)

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

小智 21

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

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

Compojure依赖于ring/ring-core,其中包括ring.util.codec,因此您已经拥有它.


sw1*_*1nn 8

就像是:

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

应该这样做......

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> 
Run Code Online (Sandbox Code Playgroud)

  • @Sathish [Hiccup](http://weavejester.github.com/hiccup/)提供了一些[相关功能](http://weavejester.github.com/hiccup/hiccup.util.html#var-url): (hiccup.util/url"/ hello"{:a 1:b 2})=>"/ hello?a = 1&b = 2"`.如果您不想仅为单个实用程序函数添加对Hiccup的依赖,那么自己编写函数确实不是什么大问题. (9认同)
  • 我也可以在地图中的每个值上使用`java.net.URLEncoder.encode`,即`(for [[kv] m](str(name k)"="(java.net.URLEncoder/encode v)) )`. (4认同)