Clojure / Compojureで、マップをURLクエリ文字列に変換するにはどうすればよいですか?
{:foo 1 :bar 2 :baz 3}
に
foo=1&bar=2&baz=3
compojureでこれを行うためのユーティリティメソッドはありますか?
はい、これには、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.util.codecを含むring / ring-coreに依存しているため、すでに使用しています。
何かのようなもの:
(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>
(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"