2015-11-03 34 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