Search code examples
clojurecompojure

Compojure binds HTTP request params from URL, but not from a POST form


Compojure does not bind the fields in a POST form. This is my route def:

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

When I post a form with fields in it, I get |{}|, i.e. there are no parameters. Incidentally, when I go http://localhost/query?param1=value1, params is not empty, and the values get printed on the server console.

Is there another binding for form fields??


Solution

  • ensure you have input fields with name="zzz" attribute, but not only id="zzz".

    html form collects all inputs and posts them using the name attribute

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

    produce response like

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