Clojure Compojure-避免;手册;使用重定向时的URL格式设置

Clojure Compojure-避免;手册;使用重定向时的URL格式设置,clojure,compojure,ring,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 "

使用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
param2
的值

所以问题是,是否有一种方法可以重定向并让Compojure格式化请求URL,同时知道它已经有了关于参数的信息?简单到:

(redirect "/another-route" arg1 arg2)
将URL itlsef格式化为:

"/another-route?param1=[value of arg1]&param2=[value of arg2]"
顺便说一句,这个想法本身并不新鲜。其他一些Web框架也有类似的功能—例如,使用Python的Flask Web框架,可以使用它从基本路径和查询参数值创建格式良好的转义URL:

# for example, in Python's Flask framework
url_for('route-name', param1='value1', param2='value2')

我相信这是一个重复的问题

此代码将实现海报寻求的目标

(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)))

您可以使用整个请求并提取查询字符串,然后重定向到添加查询字符串的新url,而不是对参数进行分解:

  (GET "/foo" req
   (ring.util.response/redirect (str "/bar?" (:query-string req))))

我不明白你所说的“将查询参数解析为arg1和arg2”是什么意思。你正在将/path?query param=x分解为x,你需要什么解析?是的,我不是在谈论解析-问题是格式化。你能不能只处理整个查询字符串,然后执行
(str)/另一个路由?
?嗯,这就是我问题的重点——首先如何获取查询字符串。我当然可以自己格式化它——这是一种选择;我的问题是——如何做到最好和最简单。是否有专门为此制作的东西,或者我们需要自己格式化URL?其他一些Web框架也有类似的功能—例如,在Python的Flask Web框架中,可以使用
url_for
()来创建一个格式良好的转义url,而不是基本路径和查询参数值。@dbasch我已经更新了上面的问题,使其更加清晰—感谢您的提问!谢谢,这种方式很好。哦,对不起,我想我没有表达我真正的意思-我不需要重用另一个查询字符串,而是构建一个全新的查询字符串,可能有不同的查询参数集。