2014-08-29 8 views
2

예를 들어 콤포 져 핸들러를 정의 할 때. defroutes 매크로를 사용하여, 나는 이런 식으로 뭔가를 할 수 있습니다 Compojure 핸들러에서 selflink를 얻는 방법?

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

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

그래서 내가 path 매개 변수의 조각을 전달하는 방법을 알고있다. 하지만 자기 링크가있는 HAL + JSON 객체를 반환하고 싶다고 가정 해보십시오. home-page 함수에 전체 URI를 전달하는 데 어떻게 defroutes를 사용할 수 있습니까?

답변

3

링 요청 맵에는 "자체 링크"를 구성하는 데 필요한 모든 정보가 들어 있습니다. 특히 :scheme, :server-name, :server-port: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)) 
+1

나는 역 프록시 요청에 문제가 기억을 당신에 당신의 반지 서버가 즉'로컬 호스트 : 1234'하지만 대중 교통은 domain.net'에 도착 : 80' . 적어도': server-port'는이 시나리오에서 1234 여야합니다. (프로토콜이 다르면 더 쉽지 않습니다. IIRC에서는 ['X-Forwarded-For'] (http://en.wikipedia.org/wiki/X-Forwarded-For)를 살펴 봐야합니다. 그러한 경우에. – xsc

+1

나는 Jetty를 사용하고 있으며 그렇게하도록 구성된 경우'X-Forwarded-For'에 대한 지원을 제공한다. 결과적으로 링 요청 맵에는 "public"scheme, server-name 및 server-port가 포함됩니다. 따라서 역방향 프록시가 사용되는 경우에도 응답의 코드가 올바르게 작동 할 수 있습니다. – ez121sl