2012-03-16 18 views
11

En Clojure/Compojure, ¿cómo convierto un mapa en una cadena de consulta de URL?¿Cómo convertir el mapa a cadena de consulta URL en Clojure/Compojure/Ring?

{:foo 1 :bar 2 :baz 3} 

a

foo=1&bar=2&baz=3 

¿Hay algún método de utilidad para hacer esto en compojure?

+0

Posible duplicado de [Clojure building of URL from constituyentes parts] (http://stackoverflow.com/questions/3644125/clojure-building-of-url-from-constituent-parts) –

Respuesta

18

Sí, hay una utilidad para esto ya que no implica o Hipo rodar su propia función string/join/URLEncoder:

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

La composición depende del anillo/núcleo del anillo, que incluye ring.util.codec, por lo que ya la tiene.

6

Algo así como:

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

debería hacerlo ...

sesión 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> 
+4

También podría usar 'java. net.URLEncoder.encode' en cada valor en el mapa, es decir '(para [[kv] m] (str (nombre k)" = "(java.net.URLEncoder/encode v)))'. – user100464

+0

Hice lo mismo, pero ¿hay un método de utilidad para hacer esto? – Sathish

+8

@Sathish [Hiccup] (http://weavejester.github.com/hiccup/) proporciona alguna [funcionalidad relevante] (http://weavejester.github.com/hiccup/hiccup.util.html#var-url): '(hiccup.util/url"/hello "{: a 1: b 2}) =>"/hello? a = 1 & b = 2 "'. Si no desea agregar una dependencia de Hiccup solo para una sola función de utilidad, escribir la función usted mismo realmente no es un gran problema. –

Cuestiones relacionadas