刷新覆盖请求正文?

我写了一个简单的客户端 - 服务器应用程序,提到“ClojureScript:启动和运行”。

https://github.com/phaendal/clojure-simple-client-server

如下面的服务器代码所示,/ text将请求和正文输出到控制台,并从(slurp (:body req))返回正文。

但是,如果:auto-refresh?project.clj设置为true(slurp (:body req))将返回空字符串而不是发送值。

为什么它返回空吗? 以及如何通过自动刷新获取请求主体?

(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还通过wrap-params添加ring.middleware.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参数中间件只是跳过它,因为您的javascript发送的值不符合规范。 如果您在POST请求中添加名称和值,则会在您的请求中显示:params键。

链接地址: http://www.djcxy.com/p/56987.html

上一篇: refresh overwrites request body?

下一篇: lein ring server: "That's not a task"