2011-10-16 40 views
10

我试图做出任何以下映射工作映射http://mysite.org/add?http://sitetoadd.comhttp://mysite.org/add?u=http://sitetoadd.com的Compojure:如何映射查询参数

(GET "/add?:url" [url] url) 
    (GET "/add?u=:url" [url] url) 
    (GET "/add" {params :params} (params :u)) 
    (GET "/add" {params :params} (params "u")) 
    (GET "/add" [u] u) 

,但它只是失败,我不知道为什么。在另一方面,这个工程:

(GET "/add/:url" [url] url) 

但我不能使用它,因为我必须要通过一个URL和http://mysite.org/add/http://sitetoadd.com是无效的,而http://mysite.org/add?http://sitetoadd.com is确定。

编辑:倾销request我已经看到参数是空的。我认为它将包含POST GET参数,但唯一可以找到我传递的参数的地方是:query-string(“u = asd”)。它seems需要一个中间件来解析查询字符串。顺便问一下,我的问题依然存在。

回答

20

请参阅https://github.com/weavejester/compojure下的突破性更改。 params地图不再默认绑定。如果你在“(defroutes main-routes ...)”中有你的示例路由,请确保通过“(handler/site main-routes)”来激活它,如https://github.com/weavejester/compojure/wiki/Getting-Started所述,因为它是使站点或api方法确保params地图默认绑定。

这里有一个工作的例子:

(ns hello-world 
    (:use compojure.core, ring.adapter.jetty) 
    (:require [compojure.route :as route] 
      [compojure.handler :as handler])) 

(defroutes main-routes 
    (GET "/" {params :params} (str "<h1>Hello World</h1>" (pr-str params))) 
    (route/not-found "<h1>Page not found</h1>")) 

(defn -main [& m] 
    (run-jetty (handler/site main-routes) {:port 8080}))