Es gibt eine url-encode
Funktion in Rings ring.util.codec
Namespace:
(ring.util.codec/url-encode "clojure url")
; => "clojure+url"
bin ich nicht sicher, ob es eine Vorverpackung Funktion, um eine Karte in eine quer drehen y string, aber vielleicht könnte dies die Arbeit machen:
(use '[ring.util.codec :only [url-encode]])
(defn make-query-string [m]
(->> (for [[k v] m]
(str (url-encode k) "=" (url-encode v)))
(interpose "&")
(apply str)))
Ein Beispiel:
user> (make-query-string {"q" "clojure url" "foo" "bar"})
"q=clojure+url&foo=bar"
Alles, was das Ergebnis auf das Ende einer URL bleibt ist verketten:
(defn build-url [url-base query-map]
(str url-base "?" (make-query-string query-map)))
Scheint zu arbeiten:
user> (build-url "http://stackoverflow.com/search" {"q" "clojure url"})
"http://stackoverflow.com/search?q=clojure+url"
Update:
Vielleicht eine modifizierte Version für eine Clojure freundliche Erfahrung machen könnte. Behandelt auch die Codierung über ein Ring-optionales Argument mit utf-8 als Standard.
(defn make-query-string [m & [encoding]]
(let [s #(if (instance? clojure.lang.Named %) (name %) %)
enc (or encoding "UTF-8")]
(->> (for [[k v] m]
(str (url-encode (s k) enc)
"="
(url-encode (str v) enc)))
(interpose "&")
(apply str))))
(defn build-url [url-base query-map & [encoding]]
(str url-base "?" (make-query-string query-map encoding)))
jetzt So können wir
tun
user> (build-url "http://example.com/q" {:foo 1})
"http://example.com/q?foo=1"
Da ich den Schnitt bemerkt habe, hätte ich mir wahrscheinlich nicht die Mühe gemacht, all das zu schreiben ... Na gut. +1 für die erste vollständige Antwort. Ich mag immer noch meine 'Named'-Handling-Version, also verlasse ich das hier. :-) –