2010-10-05 3 views
8

Compojure bindet die Felder in einem POST-Formular nicht. Das ist mein Weg def:Compojure bindet HTTP-Anforderungs-Parameter von URL, aber nicht von einem POST-Formular

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

Wenn ich ein Formular mit Feldern in es schreiben, erhalte ich | {} |, das heißt, es sind keine Parameter. Übrigens, wenn ich gehe http://localhost/query?param1=value1, Parameter ist nicht leer, und die Werte werden auf der Serverkonsole gedruckt.

Gibt es eine weitere Bindung für Formularfelder ??

Antwort

13

Stellen Sie sicher, dass Sie Eingabefelder mit name = "zzz" -Attribut haben, aber nicht nur id = "zzz".

HTML-Formular speichert alle Eingaben und Beiträge sie den Attributnamen mit

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)) 
    ;,,,, 

produzieren Antwort wie

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

3

Dies ist ein gutes Beispiel dafür, wie die Parameter zu handhaben

(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

siehe unter Beispiel 2 - Middleware sind Eigenschaften