2014-08-29 41 views
2

當定義組合處理程序例如通過使用defroutes宏,我可以做這樣的事情:如何獲得組合處理程序中的自鏈接?

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

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

所以我知道如何通過一塊path參數。但想象一下,我想用自鏈接返回一個HAL + JSON對象。我如何獲得defroutes將整個URI傳遞給home-page函數?

回答

3

戒指請求地圖包含構建「自我鏈接」的所有必要信息。具體而言,可將: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

我記得和反向代理請求麻煩,即你有你的戒指服務器localhost':1234',但公共交通到達'domain.net:80' 。在這種情況下,至少':server-port'應該是1234。 (另外,如果協議不同,它不會變得更容易; IIRC你必須看看['X-Forwarded-For'](http://en.wikipedia.org/wiki/X-Forwarded-For)在那些情況下。) – xsc 2014-08-29 19:41:44

+1

我正在使用Jetty,它提供了對「X-Forwarded-For」的支持(如果配置爲這樣做)。因此,Ring請求映射包含「公共」方案,服務器名稱和服務器端口。因此,即使使用反向代理,答案中的代碼也可以正常工作。 – ez121sl 2014-08-29 20:03:53

相關問題