lein ring 自动刷新覆盖请求正文?
lein ring auto-refresh overwrites request body?
我参考 "ClojureScript: Up and Running" 编写了简单的客户端-服务器应用程序。
https://github.com/phaendal/clojure-simple-client-server
如以下服务器代码所示,/text 将请求和正文打印到控制台,并从 (slurp (:body req))
.
打印 returns 正文
但是如果 :auto-refresh?
在 project.clj
中设置为 true
,(slurp (:body req))
将 returns 空字符串而不是发送的值。
为什么 returns 是空的?以及如何使用自动刷新获取请求正文?
(ns client-server.server
(:gen-class)
(:require [compojure.route :as route]
[compojure.core :as compojure]
[ring.util.response :as response]))
(defn simple-print [req]
(let [body (slurp (:body req) :encoding "utf-8")]
(println req)
(println (str "slurped: " body))
body))
(compojure/defroutes app
(compojure/POST "/text" request (simple-print request))
(compojure/GET "/" request
(-> "public/index.html"
(response/resource-response)
(response/content-type "text/html")
(response/charset "utf-8")))
(route/resources "/"))
当您设置 auto-refresh: true
时,lein-ring 还会添加 ring.middleware.params
到 wrap-params
。参见 https://github.com/weavejester/ring-refresh/blob/master/src/ring/middleware/refresh.clj#L90-L102。
ring.middleware.params
的工作是通过 slurp
排空请求正文来解析请求正文中的表单参数,就像您在处理程序中所做的那样。见 https://github.com/mmcgrana/ring/blob/master/ring-core/src/ring/middleware/params.clj#L29
因此,当您尝试在处理程序中吞咽请求主体时,请求主体已经清空。
此外,当您尝试 POST 时,请注意发送的内容类型。默认为 application/www-form-urlencoded
并且需要参数名称和值。见 http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2.1
仅像在 clojurescript 中那样发送纯值并不能很好地处理表单参数解析器。在您的项目示例中,ring param 中间件只是跳过它,因为从您的 javascript 发送的值不符合规范。如果您在 POST 请求中输入名称和值,它会显示在您请求的 :params 键中。
我参考 "ClojureScript: Up and Running" 编写了简单的客户端-服务器应用程序。
https://github.com/phaendal/clojure-simple-client-server
如以下服务器代码所示,/text 将请求和正文打印到控制台,并从 (slurp (:body req))
.
但是如果 :auto-refresh?
在 project.clj
中设置为 true
,(slurp (:body req))
将 returns 空字符串而不是发送的值。
为什么 returns 是空的?以及如何使用自动刷新获取请求正文?
(ns client-server.server
(:gen-class)
(:require [compojure.route :as route]
[compojure.core :as compojure]
[ring.util.response :as response]))
(defn simple-print [req]
(let [body (slurp (:body req) :encoding "utf-8")]
(println req)
(println (str "slurped: " body))
body))
(compojure/defroutes app
(compojure/POST "/text" request (simple-print request))
(compojure/GET "/" request
(-> "public/index.html"
(response/resource-response)
(response/content-type "text/html")
(response/charset "utf-8")))
(route/resources "/"))
当您设置 auto-refresh: true
时,lein-ring 还会添加 ring.middleware.params
到 wrap-params
。参见 https://github.com/weavejester/ring-refresh/blob/master/src/ring/middleware/refresh.clj#L90-L102。
ring.middleware.params
的工作是通过 slurp
排空请求正文来解析请求正文中的表单参数,就像您在处理程序中所做的那样。见 https://github.com/mmcgrana/ring/blob/master/ring-core/src/ring/middleware/params.clj#L29
因此,当您尝试在处理程序中吞咽请求主体时,请求主体已经清空。
此外,当您尝试 POST 时,请注意发送的内容类型。默认为 application/www-form-urlencoded
并且需要参数名称和值。见 http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2.1
仅像在 clojurescript 中那样发送纯值并不能很好地处理表单参数解析器。在您的项目示例中,ring param 中间件只是跳过它,因为从您的 javascript 发送的值不符合规范。如果您在 POST 请求中输入名称和值,它会显示在您请求的 :params 键中。