Compojure - 使用重定向时避免“手动”URL格式化

时间:2015-10-21 22:37:31

标签: clojure compojure ring

使用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&param2=%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]&param2=[value of arg2]"

2 个答案:

答案 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))))