Отсутствуют параметры формы в Compojure POST-запросе - PullRequest
15 голосов
/ 18 мая 2011

У меня проблемы с получением параметров формы в следующем примере 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 отсутствует в карте параметров.

Я использую Compojure 0.6.2.

Ответы [ 4 ]

15 голосов
/ 18 мая 2011

Приняли ли вы во внимание это:

Начиная с версии 0.6.0, Compojure больше не добавляет промежуточное ПО по умолчанию к маршрутам.Это означает, что вы должны явно добавить промежуточное программное обеспечение wrap-params и wrap-cookies к вашим маршрутам.

Источник: https://github.com/weavejester/compojure

Я попробовал ваш пример с моей текущей настройкой, и это сработало,Я включил следующее: require [compojure.handler :as handler] и (handler/api routes).

15 голосов
/ 20 ноября 2011

Это отличный пример того, как обрабатывать параметры

(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's 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 - Промежуточное ПО - это Особенности

0 голосов
/ 17 ноября 2012

Вот пример работоспособности на 17 ноября 2012 года:

0 голосов
/ 18 мая 2011

Вы можете просто дать список параметров;compojure автоматически получит их из параметров POST / GET соответственно.Если вам нужно делать более сложные вещи, вы можете, но я никогда не изучал, как это сделать.Например, вот фрагмент кода для 4clojure :

(POST "/problems/submit" [title tags description code]
  (create-problem title tags description code))
...