clojure - 在 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 是空的。
我错过了什么或做错了什么?
解决方案
我总是使用库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 非常简单。
推荐阅读
- c# - getfiles 中是否有特定扩展名的搜索模式(多个)?
- flutter - 在 iOS 15 beta 上使用 canvaskit 进行 Flutter web
- reactjs - 在我的 App 组件中导入 i18n 后,组件消失了
- android - Why i see Lost device connection message when open gallery using image_picker?
- c++ - Make valgrind to collect the data on request
- amazon-web-services - EMR stuck at bootstrap script
- javascript - 为什么我的所有首字母大写的函数在与最终结果比较时返回 false?Javascript
- matplotlib - i am receiving an error when trying to install plotly in jupyter notebook
- android - How to pass the correct coroutine scope in unit test when testing viewmodel
- c# - Entity Framework Property HasConversion with Arguments