2014-08-29 4 views
2

При определении обработчика compojure, например. с помощью defroutes макрос, я могу сделать что-то вроде этого:Как получить selflink в обработчике compojure?

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

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

Так что я знаю, как передать часть параметра пути. Но представьте себе, что я хочу вернуть объект HAL + JSON с помощью selflink. Как я могу получить defroutes для передачи всего URI функции home-page?

ответ

3

Карта запроса звонка содержит всю необходимую информацию для создания «selflink». В частности, :scheme, :server-name, :server-port и :uri значения могут быть собраны в полный URL-адрес запроса. Когда я столкнулся с этой проблемой, я создал промежуточное ПО Ring, которое добавляет собранный 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

Я помню, как возник проблемы с обратными-проксированными запросами, то есть у вас есть сервер Ring на 'локальные: 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», если он настроен для этого. В результате карта запросов звонка содержит «общедоступную» схему, имя сервера и сервер-порт. Таким образом, код в ответе может работать корректно, даже если используется обратный прокси. – ez121sl

 Смежные вопросы

  • Нет связанных вопросов^_^