как получить доступ/передать карту запроса в обработчике усов

Я хочу создать функцию-обработчик, которая принимает два входа. Один — это параметр, взятый из URL-адреса /name, а второй — параметр из строки запроса /name?x=3.

(def my-app (app
               [page-name] (handler page-name)))

(defn handler
  [{:keys [params]} page-name]
  (let [x (params "x")]
    (-> (page-templ page-name x) response constantly)))

Вышеупомянутое терпит неудачу, потому что обработчик ожидает 2 параметра, однако я передаю только один.

Как получить карту запросов и передать ее обработчику?

Карта запроса в приведенном выше случае содержит параметр с именем x.


person murtaza52    schedule 11.09.2012    source источник


Ответы (1)


Лучше всего, если бы вы могли отправить имя страницы, например:

(app
 [""] (index-page)
 ["login"] (serve-login))

Здесь функции index-page и serve-login возвращают функцию одного аргумента.

(defn index-page[]
  (fn [req] ..))

req — это запрос, который будет содержать все параметры URL в карте ключ/значение. Чтобы получить значение параметра, сделайте следующее:

(-> req (get :params) (get :x))

Таким образом, полное решение будет выглядеть примерно так:

(def my-app (app
               ["page1-name"] (handler)))

(defn handler []
  (fn [req]
    (let [x (-> req :params :x)]
      (-> (page-templ page-name x) response))))

РЕДАКТИРОВАНИЕ: не забудьте обернуть ваше приложение в (wrap-keyword-params) и (wrap-params), вот как вы можете это сделать:

(def my-wrapped-app
  (-> my-app
   (wrap-keyword-params)
   (wrap-params))
person Ivan Koblik    schedule 11.09.2012
comment
Другое дело, что не стоит использовать постоянно, если ответ зависит от запроса. constantly используется для быстрого возврата ответа, который не зависит от запроса, то есть ему все равно, есть ли у вас какие-либо параметры или нет. - person Ivan Koblik; 11.09.2012
comment
Спасибо за ответ, это было очень полезно. Теперь я определяю все свои функции вышеописанным образом. Однако я не могу заставить работать параметры wrap-keyword-params. Я все еще получаю строковые ключи. Я разместил свой код на github.com/murtaza52/hs-ex. - person murtaza52; 12.09.2012
comment
Извините, ваше веб-приложение не работает, но я думаю, что если вы укажете обертки в макросе приложения, вам нужно изменить их порядок: (app (wrap-params) (wrap-keyword-params) [] (serve-index) ) - person Ivan Koblik; 12.09.2012
comment
Да, это будет ошибкой. Позвольте мне исправить это. И как вы пытались его запустить? Также у меня есть два маршрута [] и [/], оба указывают на один и тот же обработчик (serve-index), есть ли способ указать один маршрут для обоих вместо двух отдельных? - person murtaza52; 12.09.2012
comment
Вам не нужно иметь маршрутизацию для /, отправляйте только на . Для более глубоких уровней используйте что-то вроде [level1 level2] это соответствует URL-адресу host/level1/level2. Отвечая на ваш первый вопрос, я клонировал ваш репозиторий и выполнил lein repl, я увидел, что у вас есть хук в project.clj, он не мог загрузить шаблоны. - person Ivan Koblik; 12.09.2012
comment
У меня есть каталог ресурсов в моем общедоступном каталоге, который я создал символической ссылкой в ​​своем каталоге src, так что enlive может получить его из src. Какая у вас ОС, может быть, она не создает символическую ссылку? - person murtaza52; 12.09.2012
comment
давайте продолжим обсуждение в чате - person murtaza52; 12.09.2012