#web-services #clojure #compojure #ring #noir
#веб-сервисы #clojure #compojure #кольцо #noir
Вопрос:
Есть ли способ получить объект HttpServletRequest в кольцевом обработчике? Я использую Noir для разработки веб-приложения. Мне нужно получить объект HttpServletRequest при обработке URI. Поэтому я использую функцию (noir.request.ring-request), чтобы вернуть карту запроса ring, которая содержит: ключ запроса сервлета, но значение равно нулю. Это правильный способ сделать это или я что-то пропустил?
ниже приведен код:
(ns my-app
(:use noir.request))
(defpage [:get "/app"] []
(str (ring-request)))
результат:
{:remote-addr "127.0.0.1", :scheme :http, :query-params {}, :session {}, :form-params {}, :multipart-params {}, :servlet #, :request-method :get, :query-string nil, :content-type nil, :cookies {"ring-session" {:value "eb509a65-d33a-40d2-9646-e2ff785428b0"}}, :uri "/app", :server-name "127.0.0.1", :params {}, :headers {"cookie" "ring-session=eb509a65-d33a-40d2-9646-e2ff785428b0", "accept-charset" "GBK,utf-8;q=0.7,*;q=0.3", "accept-language" "en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4", "accept-encoding" "gzip,deflate,sdch", "accept" "text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8", "user-agent" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2", "connection" "keep-alive", "host" "127.0.0.1:8080"}, :servlet-request #, :content-length nil, :server-port 8080, :character-encoding nil, :servlet-response #, :body #, :servlet-context #}
Комментарии:
1. Из интереса, что вы пытаетесь сделать с объектом запроса? Может быть, есть какой-то другой способ добиться этого.
Ответ №1:
Похоже, что карта кольцевых запросов создается на основе адаптера, который вы используете для веб-сервера. В случае jetty это происходит в ring.adapter.jetty:
https://github.com/ring-clojure/ring/blob/master/ring-jetty-adapter/src/ring/adapter/jetty.clj
На вашем месте я бы создал свой собственный адаптер, который явно добавляет то, что вам нужно, в карту запросов. В частности, вы бы заменили
запрос-сопоставление (запрос сервлета / сборки-запроса-сопоставления)
с помощью чего-то вроде:
запрос-карта (assoc (servlet / build-request-map request): запрос jetty-request)