Clojurescript сериализует форму AJAX POST

Сериализация формы в 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))

person WorldsEndless    schedule 03.11.2015    source источник


Ответы (1)


Вы должны указать правильный тип в значении :body вашего сообщения.

В вашем примере вы поместили объект DOM формы с идентификатором userform в качестве значения :body, хотя вы указали, что тип содержимого тела вашего сообщения ajax — application/x -www-form-urlencoded вид строки.

Вы можете использовать закрытие Google 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}})
person mavbozo    schedule 03.11.2015
comment
Я пробовал это, но мой сервер по-прежнему записывает тот же запрос: application/transit+json типа контента, form-params {} и ByteArrayInputStream в качестве тела. Это стандартное промежуточное ПО Luminus. - person WorldsEndless; 04.11.2015
comment
не могли бы вы опубликовать свой код обработчика для /update-user? - person mavbozo; 04.11.2015
comment
Сделанный; он просто печатает запрос. - person WorldsEndless; 04.11.2015