2012-03-16 13 views
11

Clojure/Compojureでは、マップをURLクエリ文字列に変換するにはどうすればよいですか?マップをClojure/Compojure/RingのURLクエリ文字列に変換する方法は?

foo=1&bar=2&baz=3 

{:foo 1 :bar 2 :baz 3} 

compojureでこれを行うには、いずれかのユーティリティメソッドがありますか?

+0

[構成部品からのURLのClojureビルド]の可能な複製(http://stackoverflow.com/questions/3644125/clojure-building-of-url-from-constituent-parts) –

答えて

18

はい、このためのユーティリティはヒカップかを伴わないすでにあります独自の文字列/結合/ URLエンコーダ関数をロールバックする:

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

Compojureはring/coreに依存しています。これにはring.util.codecが含まれているので、既に持っています。

6

ような何か:

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

また、 'javaを使用することもできます。 ([kv] m)(str(name k) "="(java.net.URLEncoder/encode v))) 'の各値に対して、' net.URLEncoder.encode'を実行します。 – user100464

+0

私は同じことをしましたが、これを行うユーティリティメソッドがありますか? – Sathish

+8

@ Sathish [Hiccup](http://weavejester.github.com/hiccup/)では、[関連する機能](http://weavejester.github.com/hiccup/hiccup.util.html#var-url)を提供しています。 (helic "{:a 1:b 2})=>"/hello?a = 1&b = 2 "'単一のユーティリティー機能のためだけにHiccupに依存関係を追加したくない場合は、実際に関数を書くのは大したことではありません。 –

関連する問題