Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何在compojure处理程序中获取selflink?_Json_Clojure_Compojure_Hateoas - Fatal编程技术网

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

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传递到主页函数?环请求映射包含构建“自链接”所需的所

定义compojure处理程序时,例如通过使用
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
的支持,如果配置为这样做的话。因此,环请求映射包含“公共”方案、服务器名称和服务器端口。因此,即使使用反向代理,答案中的代码也可以正常工作。