Compojure связывает параметры HTTP-запроса из URL, но не из формы POST - PullRequest
8 голосов
/ 05 октября 2010

Compojure не связывает поля в форме POST. Это мой маршрут def:

(defroutes main-routes
  (POST "/query" {params :params}
    (debug (str "|" params "|"))
    "OK...")
)

Когда я публикую форму с полями в ней, я получаю | {} |, то есть нет никаких параметров. Между прочим, когда я иду http://localhost/query?param1=value1, params не пусто, и значения печатаются на консоли сервера.

Есть ли еще одна привязка для полей формы?

Ответы [ 2 ]

13 голосов
/ 05 октября 2010

убедитесь, что у вас есть поля ввода с атрибутом name = "zzz", но не только id = "zzz".

HTML-форма собирает все входные данные и публикует их, используя атрибут name

my_post.html

<form action="my_post_route" method="post">
    <label for="id">id</label> <input type="text" name="id" id="id" />
    <label for="aaaa">aaa</label> <input type="text" name="aaa" id="aaa" />
    <button type="submit">send</button>
</form>

my_routes.clj

(defroutes default-handler
  ;,,,,
  (POST "/my_post_route" {params :params} 
    (str "POST id=" (params "id") " params=" params))
  ;,,,,

производит ответ типа

id = 21 params = {"aaa" "aoeu", "id"" 21 "}

3 голосов
/ 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 - Middleware is Features

...