首页 > 解决方案 > 在 Clojure / Ring / HttpKit 应用程序中获取 POSTed 数据

问题描述

我正在编写一个简单的 HttpKit / Ring 应用程序,并试图将一些数据从表单发布到它。

这是我的服务器代码的相关部分:

(defn save-page [request]
  (let [qs (:query-string request)
        fp (:form-params request)]
    (println "SAVE PAGE :: ")
    (println (str request))
    (println (str "CCCC" fp))
    (println (str qs))))

(defn handler [{:keys [uri request-method] :as request}]
  (let []
    (cond 
      ; view a page 
      (= uri "/clj_ts/view")
      (get-page request)

      (= uri "/clj_ts/save")
      (save-page request)

      :otherwise 

      .. STUFF )))

(defn -main [& args]
  (-> #'handler
      (wrap-content-type)
      (wrap-keyword-params)
      (wrap-params)
      (wrap-reload)
      (wrap-resource "clj_ts")
      (run-server {:port 0})))

这是发布到它的客户端代码。

(defn generate-form-data [params]
  (let [form-data (js/FormData.)]
    (doseq [[k v] params]
      (.append form-data (name k) v))
    form-data))

(defn save-page! []
  (let [page-name (-> @db :current-page)
        new-data (-> js/document
                     (.getElementById "edit-field") 
                     .-value)
        form-data (generate-form-data 
                    {"page" page-name
                     "data" new-data})] 
    (js/console.log "SAVING")
    (js/console.log (str new-data))
    (.send XhrIo
      "/clj_ts/save"
      (fn [e] e)
      "POST"
      form-data)))

现在,我可以从浏览器的开发人员工具中看到,我正在使用包含页面和数据值的表单数据发布一些内容。

但是在我的服务器端代码中,请求的 :form-params 是空的。

我错过了什么或做错了什么?

标签: clojureclojurescripthttp-kitclojure-ring

解决方案


我总是使用库cljs-ajax而不是直接的 JS 互操作。然后您可以执行以下操作:

; Post a transit format message
(POST "/send-message"
        {:params {:message "Hello World"
                  :user    "Bob"}
         :handler handler
         :error-handler error-handler})

它们还具有明确的 FormData 支持:

; Send file explicitly, ClojureScript specific
(let [form-data (doto
                    (js/FormData.)
                  (.append "id" "10")
                  (.append "file" js-file-value "filename.txt"))]
  (POST "/send-file" {:body form-data
                      :response-format (raw-response-format)
                      :timeout 100}))

他们的 README 非常简单。


推荐阅读