>> q 'q=clojure+url' >>> url = -6ren">
gpt4 book ai didi

url - Clojure 从组成部分构建 URL

转载 作者:行者123 更新时间:2023-12-03 22:49:52 25 4
gpt4 key购买 nike

在 Python 中,我会执行以下操作:

>>> q = urllib.urlencode({"q": "clojure url"})
>>> q
'q=clojure+url'

>>> url = "http://stackoverflow.com/search?" + q
>>> url
'http://stackoverflow.com/search?q=clojure+url'

我如何完成上面在 Clojure 中为我完成的所有编码?换句话说,我如何做类似于以下的事情:
=> (build-url "http://stackoverflow.com/search" {"q" "clojure url"})
"http://stackoverflow.com/search?q=clojure+url"

最佳答案

有一个url-encode Ring 中的函数 ring.util.codec命名空间:

(ring.util.codec/url-encode "clojure url")
; => "clojure+url"

我不确定是否有一个预先打包的函数可以将 map 转换为查询字符串,但也许这可以完成这项工作:
(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)))

一个例子:
user> (make-query-string {"q" "clojure url" "foo" "bar"})
"q=clojure+url&foo=bar"

剩下的就是将结果连接到 URL 的末尾:
(defn build-url [url-base query-map]
(str url-base "?" (make-query-string query-map)))

似乎工作:
user> (build-url "http://stackoverflow.com/search" {"q" "clojure url"})
"http://stackoverflow.com/search?q=clojure+url"

更新:

也许修改后的版本可能会带来对 Clojure 更友好的体验。还通过以 utf-8 为默认值的 Ring-style 可选参数处理编码。
(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)))

所以现在我们可以做
user> (build-url "http://example.com/q" {:foo 1})
"http://example.com/q?foo=1"

关于url - Clojure 从组成部分构建 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com