定义一个compojure处理程序,例如通过使用defroutes
宏,我可以这样做:
(defroutes home-routes
(GET "/myhome/:id" [ id ] (home-page)))
(defn home-page [ id ]
( ... do something ... ))
所以我知道如何传递一段路径参数。但想象一下,我想返回一个带有自链接的HAL + JSON对象。如何让defroutes将整个URI传递给home-page
函数?
答案 0 :(得分:3)
Ring请求映射包含构建" selflink"的所有必要信息。具体而言,:scheme
,:server-name
,:server-port
和:uri
值可以汇总到完整的请求网址中。当我遇到这个问题时,我创建了Ring中间件,它将组合的请求URL添加到Ring请求映射中。然后,只要我将请求映射(或其某个子集)传递给处理程序,我就可以在处理程序中使用请求URL。以下代码段显示了实现此目的的一种方法:
(defroutes app-routes
(GET "/myhome/:id" [id :as {:keys [self-link]}] (home-page id self-link))
(route/resources "/")
(route/not-found "Not Found"))
(defn wrap-request-add-self-link [handler]
(fn add-self-link [{:keys [scheme server-name server-port uri] :as r}]
(let [link (str (name scheme) "://" server-name ":" server-port uri)]
(handler (assoc r :self-link link)))))
(def app
(-> app-routes
handler/site
wrap-request-add-self-link))