2012-03-16 13 views
11

Clojure/Compojure'da, bir haritayı bir URL sorgu dizesine nasıl dönüştürebilirim? compojure bunu yapmanın herhangi yarar yöntemHarita, Clojure/Compojure/Ring'deki URL sorgu dizesine nasıl dönüştürülür?

foo=1&bar=2&baz=3 

için

{:foo 1 :bar 2 :baz 3} 

var mı?

+0

Olası çoğaltması [Kurucu bileşenlerden URL'nin Clojure yapısı] (http://stackoverflow.com/questions/3644125/clojure-building-of-url-from-constituent-parts) –

cevap

18

Evet, bunun için bir yarar zaten içermeyen Hıçkırık ya yoktur haddeleme kendi dize/join/URLEncoder fonksiyonu:

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

Compojure, ring.util.codec içeren ring/ring-core'ye bağlı olduğundan, zaten var.

6

şey gibi:

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

yapmalıyım ...

REPL oturum:

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

Ayrıca java'yı kullanabilirim. net.URLEncoder.encode' haritadaki her bir değere, yani '([[kv] m] için (str (isim k)" = "(java.net.URLEncoder/encode v))). – user100464

+0

Aynı şeyi yaptım ama bunu yapmak için bir yardımcı program var mı? – Sathish

+8

@Sathish [Hıçkıdık'ın] (http://weavejester.github.com/hiccup/) (http://weavejester.github.com/hiccup/hiccup.util.html#var-url) bir kısmı [ilgili özelliğe] sağlamaktadır: '(hiccup.util/url"/merhaba "{: a 1: b 2}) =>"/merhaba? a = 1 & b = 2 "'. Sadece tek bir yardımcı fonksiyon için Hiccup'a bir bağımlılık eklemek istemiyorsanız, fonksiyonu kendiniz yazmak gerçekten büyük bir şey değildir. –

İlgili konular