Clojurescript序列化形式AJAX POST

时间:2015-11-03 00:15:03

标签: ajax forms clojure clojurescript luminus

在Clojurescript

中序列化表单

我通过Clojurescript提交了一个简单的小表格(由我的Clojure / Luminus服务器收到)。如果我只是使用提交按钮提交表单,我可以看到响应中包含以下部分:

:form-params {__anti-forgery-token TDsE55j9y7d1dT2eWOGnmECMnnNXWo5tIDVzENc9lr1aiJSqOKIVmmmq/XmaC2M6GHN086+VeROwi7up, app-type professorial}

但是当我用CLJS-Ajax发布它时,我看到了:

; ...
:body #object[java.io.ByteArrayInputStream 0x23bbfd9d java.io.ByteArrayInputStream@23bbfd9d]
:form-params {}
; ...

因此,表格一旦到达服务器就会被放入ByteArrayInputStream中。 ajax / clojurescript代码如下所示:

(defn submit-update-form []
  (let [form (.getElementById js/document "userform")
        url "/update-user"
        csrf-token (.-value (.getElementById js/document "token"))]
    (.log js/console form)
    (POST url {:handler #(js/alert "Submission!")
               :content-type "application/x-www-form-urlencoded"
               :body form
               :headers {:x-csrf-token csrf-token}})
    ;(.submit form)
    false))

显然,我需要以某种方式将序列化的表单内容放入帖子的:form-params中。怎么办呢?

我尝试启动并运行我的处理程序代码非常简单:

(POST "/update-user" req
    (println req))

1 个答案:

答案 0 :(得分:2)

您必须在帖子的:body值中输入正确的类型。

在您的示例中,您将 userform 标识的表单的DOM对象作为:body值,尽管您指定了ajax帖子正文的内容类型是 application / x-www-form-urlencoded 种类的字符串。

您可以使用谷歌关闭goog.dom.forms.getFormDataString。您可以在https://google.github.io/closure-library/api/namespace_goog_dom_forms.html#getFormDataString

找到该函数的文档字符串

表单序列化POST调用的已修改代码段:

;; (:require [goog.dom.forms :as gforms]) ;; require it first and alias it to gforms

(POST url {:handler      #(js/alert "Submission!")
           :content-type "application/x-www-form-urlencoded"
           :body         (gforms/getFormDataString form)
           :headers      {:x-csrf-token csrf-token}})