2011-10-16 78 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}))