0

我有一个基于 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中间件应该用解析的版本(地图?)替换请求正文。

但是,我(prn body)json-post处理程序中得到的输出是这样的: #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) 的长度也是正确的正文长度。

我已经没有东西可以尝试了。有任何想法吗?

4

1 回答 1

3

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

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

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

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

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

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

于 2017-02-09T09:16:17.677 回答