2

在 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))
4

1 回答 1

2

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

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

你可以使用谷歌关闭的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}})
于 2015-11-03T16:01:33.773 回答