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


标签:json
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号