Отсутствующие параметры формы в запросе POST Compojure
У меня возникают проблемы с получением параметров формы в следующем примере Compojure:
(ns hello-world
(:use compojure.core, ring.adapter.jetty)
(:require [compojure.route :as route]))
(defn view-form []
(str "<html><head></head><body>"
"<form method=\"post\">"
"Title <input type=\"text\" name=\"title\"/>"
"<input type=\"submit\"/>"
"</form></body></html>"))
(defroutes main-routes
(GET "/" [] "Hello World")
(GET "/new" [] (view-form))
(POST "/new" {params :params} (prn "params:" params))
(route/not-found "Not Found"))
(run-jetty main-routes {:port 8088})
При отправке формы вывод всегда
params: {}
и я не могу понять, почему параметр title отсутствует в карте params.
Я использую Compojure 0.6.2.
Ответы
Ответ 1
Вы учли это:
Начиная с версии 0.6.0, Compojure больше не добавляет промежуточное ПО по умолчанию к маршрутам. Это означает, что вы должны явно добавить в свои маршруты связывание wrap-params и wrap-cookies.
Источник: https://github.com/weavejester/compojure
Я попробовал ваш пример с моей текущей настройкой, и это сработало. Я включил следующее: require [compojure.handler :as handler]
и (handler/api routes)
.
Ответ 2
Это отличный пример того, как обрабатывать параметры
(ns example2
(:use [ring.adapter.jetty :only [run-jetty]]
[compojure.core :only [defroutes GET POST]]
[ring.middleware.params :only [wrap-params]]))
(defroutes routes
(POST "/" [name] (str "Thanks " name))
(GET "/" [] "<form method='post' action='/'> What your name? <input type='text' name='name' /><input type='submit' /></form>"))
(def app (wrap-params routes))
(run-jetty app {:port 8080})
https://github.com/heow/compojure-cookies-example
См. пример 2 - Среднее ПО - это функции
Ответ 3
Вы можете просто указать список параметров; compojure автоматически выведет их из параметров POST/GET соответственно. Если вам нужно делать более сложные вещи, вы можете, но я никогда не смотрел, как это сделать. Например, здесь фрагмент кода из 4clojure:
(POST "/problems/submit" [title tags description code]
(create-problem title tags description code))
Ответ 4
здесь приведен пример с 17 ноября 2012 года: