Как преобразовать карту в строку запроса URL-адреса в Clojure/Compojure/Ring?

В Clojure/Compojure, как преобразовать карту в строку запроса URL?

{:foo 1 :bar 2 :baz 3}

к

foo=1&bar=2&baz=3

Есть ли какой-либо метод полезности для этого в compojure?

Ответ 1

Да, для этого уже есть утилита, которая не включает в себя 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, поэтому вы уже имеете его.

Ответ 2

Что-то вроде:

(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> 

Ответ 3

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

Этот код удаляет ":" из ключевых слов, но выдает исключение, если ключевые слова являются числами.

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