Json 如何在compojure处理程序中获取selflink?
定义compojure处理程序时,例如通过使用Json 如何在compojure处理程序中获取selflink?,json,clojure,compojure,hateoas,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传递到主页函数?环请求映射包含构建“自链接”所需的所
defroutes
宏,我可以执行以下操作:
(defroutes home-routes
(GET "/myhome/:id" [ id ] (home-page)))
(defn home-page [ id ]
( ... do something ... ))
所以我知道如何传递一段路径参数。但假设我想返回一个带有自链接的HAL+JSON对象。如何让defroutes将整个URI传递到
主页
函数?环请求映射包含构建“自链接”所需的所有信息。具体而言,:scheme
,:服务器名称
,:服务器端口
,以及:uri
值可以组合成完整的请求URL。当我遇到这个问题时,我创建了环形中间件,将组装好的请求URL添加到环形请求映射中。然后,只要我将请求映射(或其某个子集)传递到处理程序中,我就可以在处理程序中使用请求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))
我记得反向代理请求时遇到了问题,即您的环服务器位于
localhost:1234
,但公共流量到达domain.net:80
。在这种情况下,服务器端口至少应为1234。(此外,如果协议不同,也不会变得更容易;在这些情况下,您必须查看IIRC。)我使用的是Jetty,它提供了对X-Forwarded-for
的支持,如果配置为这样做的话。因此,环请求映射包含“公共”方案、服务器名称和服务器端口。因此,即使使用反向代理,答案中的代码也可以正常工作。