Доступ к строке запроса Compojure - PullRequest
10 голосов
/ 22 января 2012

Я пытаюсь извлечь значение из строки запроса URL, однако я могу вернуть то, что, как я считаю, является картой, однако, когда я использую приведенный ниже код, она не обрабатывается должным образом. Кто-нибудь может посоветовать, как получить доступ к конкретным значениям в возвращенной структуре данных строки запроса?

http://localhost:8080/remservice?foo=bar

(defroutes my-routes
  (GET "/" [] (layout (home-view)))
  (GET "/remservice*" {params :query-params} (str (:parameter params))))

Ответы [ 4 ]

18 голосов
/ 23 января 2012

Вам нужно будет обернуть ваш обработчик в compojure.handler/api или compojure.handler/site, чтобы добавить соответствующее промежуточное ПО для получения доступа к :query-params.Раньше это происходило автоматически в defroutes, но больше не происходит.Как только вы это сделаете, форма деструктурирования {params :query-params} приведет к тому, что params будет привязан к {"foo" "bar"}, когда вы нажмете /remservice с foo=bar в качестве строки запроса.

(Или вы можете добавить вwrap-params и т. Д. Вручную - они находятся в различных ring.middleware.* пространствах имен; см. код compojure.handler (ссылки на соответствующий файл в Compojure 1.0.1) для их имен.)

Например,

(defroutes my-routes
  (GET "/remservice*" {params :query-params}
       (str params)))

(def handler (-> my-routes compojure.handler/api))

; now pass #'handler to run-jetty (if that's what you're using)

Если вы сейчас нажмете http://localhost:8080/remservice?foo=bar, вы должны увидеть {"foo" "bar"} - текстовое представление строки запроса, проанализированной в карте Clojure.

1 голос
/ 29 октября 2014

В приложении по умолчанию для compojure 1.2.0 промежуточное ПО строки запросов, по-видимому, включено по умолчанию. Вы можете проверить запрос как таковой.

(GET "/" request (str request))

В нем должно быть много вещей, включая клавишу params.

{ . . .  :params {:key1 "value1" :key2 "value2} . . . }

Таким образом, вы можете включить стандартную форму деструктуризации Clojure для доступа к параметрам запроса в вашем ответе.

(GET "/" {params :params} (str params))

Ваша страница должна выглядеть следующим образом.

{"key1" "value1", "key2" "value2"}

Как отмечалось в комментарии Михала выше, однако, ключи преобразуются в строки, и если вы хотите получить к ним доступ, вам нужно использовать функцию get, а не более удобный поиск символов.

(GET "/" {params :params} (get params "key1"))

;;the response body should be "value1"
0 голосов
/ 24 июня 2018

С compojure 1.6.1 У меня HTTP-запрос-деструктуризация работает следующим образом:

  1. add [ring/ring-defaults "0.3.2"] в :dependencies в project.clj (поскольку пространство имен compojure.handler устарело с тех пор, как1.2 в пользу [ring-defaults])
  2. добавить [ring.middleware.defaults :refer :all] в :require в your.routes.namespace
  3. добавить (def site (wrap-defaults app site-defaults)) в your.routes.namespace, где app объявлено через (defroutes app ...
  4. добавить :ring {:handler your.routes.namespace/site} в project.clj
0 голосов
/ 26 сентября 2013

Мне повезло, что в compojure 1.1.5 мне не нужна оболочка и я могу использовать директиву :as

(GET "/tweet/:folder/:detail" [folder detail :as req]
  (twitter-controller/tweet folder detail (-> req :params :oauth_verifier))
...