【问题标题】:Parse JSON body from HTTP request (with ring and re-frame-http-fx)从 HTTP 请求解析 JSON 正文(使用 ring 和 re-frame-http-fx)
【发布时间】:2017-02-08 11:24:30
【问题描述】:

我有一个基于 re-frame 的 UI,并尝试使用 re-frame-http-fx 与我的服务器通信。发送和响应似乎有效。但是,我不知道如何将 JSON 正文解析为服务器上的 Clojure 映射。

这是我的handler.clj,我可以得到它:

(ns my.handler
  (:require [compojure.core :refer [GET POST defroutes]]
            [compojure.route :refer [resources]]
            [ring.util.response :refer [resource-response]]
            [ring.middleware.json :refer [wrap-json-response wrap-json-body]]))

(defn json-post [request]
  (let [body (:body request)]
    (prn body)
    body))

(defroutes routes
  (GET       "/"     []      (resource-response "index.html" {:root "public"}))
  (POST      "/post" request json-post)
  (resources "/"))

(def handler (wrap-json-response (wrap-json-body routes {:keywords? true})))

据我了解,wrap-json-body 中间件应将请求正文替换为解析后的版本(地图?)。

但是,我在 json-post 处理程序中从 (prn body) 得到的输出是这样的: #object[org.httpkit.BytesInputStream 0xda8b162 "BytesInputStream[len=41]"]

如果我尝试(prn (:title body)) 之类的东西,我会得到nil(尽管原始的map-turned-json-request 包含:title,以及请求和响应正文)。

请求和响应包含正确的 json。请求Content-Type 正确设置为application/json(由re-frame-http-fx 发送)。缓冲区的长度 (41) 也是根据请求的正确正文长度。

我要尝试的东西已经不多了。有什么想法吗?

【问题讨论】:

  • 你能尝试 slurping 输入流看看里面有什么吗?您可以尝试不包装 JSON 响应吗?
  • 啜饮输入流给了我包含预期 json 的原始请求正文。我没有尝试删除环中间件,因为我偶然发现了解决方案(见答案)。感谢和抱歉给您带来的麻烦。

标签: clojure ring re-frame


【解决方案1】:

在进一步调查该问题时,我发现了导致该效果的错误。它涉及重新框架模板中的dev-handler,我在问题中的最小示例中很方便地省略了该模板。

我没有意识到这是个问题,因为即使您从 handler.clj 中删除了 dev-handler 的整个定义,应用程序似乎也可以正常启动,我假设是因为服务器在 server.clj 中使用 handler 进行了初始化无论如何(并且客户端不会致命地失败)。

但是,在re-frame模板的project.clj中,为figwheel配置了以下内容:

  :figwheel {:css-dirs ["resources/public/css"]
             :ring-handler my.handler/dev-handler}

这导致为handler 配置的中间件未应用于我的请求,因此无法解开 json 正文。更改dev-handler 的定义(与问题中的handler 相同)或project.clj 中figwheel 的配置(指向handler 而不是dev-handler)可以解决问题。

如果有人知道project.cljserver.clj 中不同处理程序的推理,请随时告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多