我通过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))
答案 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}})