如何在compojure处理程序中获取selflink?

时间:2014-08-29 16:23:59

标签: json clojure compojure hateoas

定义一个compojure处理程序,例如通过使用defroutes宏,我可以这样做:

(defroutes home-routes
  (GET "/myhome/:id" [ id ] (home-page)))

(defn home-page [ id ]
   ( ... do something ... ))

所以我知道如何传递一段路径参数。但想象一下,我想返回一个带有自链接的HAL + JSON对象。如何让defroutes将整个URI传递给home-page函数?

1 个答案:

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