使用Compojure,有没有办法重定向到其中一条已定义的路由,而不必格式化请求URL?
例如,在以下简化的defroutes
声明中:
(defroutes app-routes
; ...
(GET "/something-that-may-redirect" [query-param]
; parse `query-param` into `arg1` and `arg2` and:
(ring.util.response/redirect (format "/another-route?param1=%s¶m2=%s" arg1 arg2))
(GET "/another-route" [param1 param2] ...)
; ...
在这里,我必须格式化URL以重定向(并且通常也处理转义),以便稍后由Compojure自己解析此URL并提取param1
和{{1的值}}。
所以问题是,是否存在重定向方法并让Compojure格式化请求URL,知道它已经有关于参数的信息?简单的事情:
param2
它会将URL格式化为:
(redirect "/another-route" arg1 arg2)
P.S。这个想法本身并不新鲜。其他一些Web框架具有类似的功能 - 例如,使用Python的Flask Web框架,可以使用url_for从基本路径和查询参数值中创建格式良好且已转义的URL:
"/another-route?param1=[value of arg1]¶m2=[value of arg2]"
答案 0 :(得分:2)
我认为这是一个重复的问题How to convert map to URL query string in Clojure/Compojure/Ring?
此代码将实现海报所寻求的目标。
(defroutes app-routes
(GET "/something-that-may-redirect" [arg1 arg2]
(redirect (str "/another-route" "?" (ring.util.codec/form-encode {:param1 arg1 :param2 arg2}))))
(GET "/another-route" response (str response)))
答案 1 :(得分:0)
您可以使用整个请求并提取查询字符串,然后重定向到附加了查询字符串的新网址,而不是解构参数:
(GET "/foo" req
(ring.util.response/redirect (str "/bar?" (:query-string req))))