2015-11-03 149 views
2

序列化形式Clojurescript

我提交通过Clojurescript一个简单的,小的形式(通过我的Clojure/Luminus公司服务器接收)。如果我只是一个提交按钮提交表单,我可以看到,响应包括这样的部分:Clojurescript连载形式AJAX POST

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

但是,当我与CLJS阿贾克斯后,我看到:

; ... 
:body #object[java.io.ByteArrayInputStream 0x23bbfd9d [email protected]] 
:form-params {} 
; ... 

因此,一旦它显示到服务器上,表单就会被放入一个ByteArrayInputStream中。阿贾克斯/ 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)) 

显然,我需要以某种方式把序列化形式的内容到:该职位的形式-PARAMS。如何才能做到这一点?

我的处理程序代码,我试图让这个启动和运行是死的简单:

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

回答

2

你必须把你的文章的:body值正确的类型。

在你的榜样,你把虽然你指定的内容类型的AJAX后的身体是由用户窗体 id'd为:body价值形态的DOM对象应用程序/ x-WWW-形式 - 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}}) 
+0

我已经试过这一点,但我的服务器仍然记录了同样的要求:内容 - 键入application/transit + json,form-params {}和一个ByteArrayInputStream作为正文。这是Luminus的默认中间件。 – WorldsEndless

+0

你可以发布你的“/ update-user”的处理程序代码吗? – mavbozo

+0

完成;它只是打印请求。 – WorldsEndless