json之如何在 compojure 处理程序中获取 selflink
softidea
阅读:39
2025-02-15 21:57:57
评论:0
当定义一个 compojure 处理程序时,例如通过使用 defroutes
宏,我可以做这样的事情:
(defroutes home-routes
(GET "/myhome/:id" [ id ] (home-page)))
(defn home-page [ id ]
( ... do something ... ))
所以我知道如何传递一段路径参数。但想象一下,我想返回一个带有自链接的 HAL+JSON 对象。我如何获得 defoutes 以将整个 URI 传递给 home-page
函数?
请您参考如下方法:
Ring 请求映射包含构建“selflink”所需的所有信息。具体来说,:scheme
、:server-name
、:server-port
、:uri
值可以组装到完整的请求 URL。当我遇到这个问题时,我创建了 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))
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。