Ring 的 ring.util.codec
命名空间中有一个 url-encode
函数:
(ring.util.codec/url-encode "clojure url")
我不确定是否有一个预设的函数可以将一个映射转换成查询字符串,但也许这个方法可以完成任务:
(use '[ring.util.codec :only [url-encode]])
(defn make-query-string [m]
(->> (for [[k v] m]
(str (url-encode k) "=" (url-encode v)))
(interpose "&")
(apply str)))
一个例子:
user> (make-query-string {"q" "clojure url" "foo" "bar"})
"q=clojure+url&foo=bar"
现在只需要将结果连接到一个URL的末尾:
(defn build-url [url-base query-map]
(str url-base "?" (make-query-string query-map)))
似乎可以正常工作:
user> (build-url "http://stackoverflow.com/search" {"q" "clojure url"})
"http://stackoverflow.com/search?q=clojure+url"
更新:
也许修改版本会为Clojure提供更友好的体验。同时,通过一个可选的参数进行编码处理,采用utf-8作为默认值。
(defn make-query-string [m & [encoding]]
(let [s #(if (instance? clojure.lang.Named %) (name %) %)
enc (or encoding "UTF-8")]
(->> (for [[k v] m]
(str (url-encode (s k) enc)
"="
(url-encode (str v) enc)))
(interpose "&")
(apply str))))
(defn build-url [url-base query-map & [encoding]]
(str url-base "?" (make-query-string query-map encoding)))
现在我们可以这样做
user> (build-url "http://example.com/q" {:foo 1})
"http://example.com/q?foo=1"
ring.util.codec
也接受一个可选的编码参数,默认为UTF-8
。 - Michał Marczyk