Clojure 环json';s包装json响应中间件,compojure返回text/plain?

Clojure 环json';s包装json响应中间件,compojure返回text/plain?,clojure,compojure,ring,Clojure,Compojure,Ring,我试图在我的compojure应用程序中使用ring json的wrap json响应中间件。我有一个简单的GET处理程序,它返回一个映射,比如{:foo 1},当我点击URL时,ring会用文本/普通的和一个空的响应体进行响应。我似乎无法让它用JSON版本的地图来响应 以下是我的处理程序代码: (ns localshop.handler (:use compojure.core) (:require [localshop.routes.api.items :as routes-api-

我试图在我的compojure应用程序中使用ring json的wrap json响应中间件。我有一个简单的GET处理程序,它返回一个映射,比如
{:foo 1}
,当我点击URL时,ring会用
文本/普通的
和一个空的响应体进行响应。我似乎无法让它用JSON版本的地图来响应

以下是我的处理程序代码:

(ns localshop.handler
  (:use compojure.core)
  (:require [localshop.routes.api.items :as routes-api-items]
            [ring.middleware.json :as middleware]
            [compojure.handler :as handler]
            [compojure.route :as route]))

;; map the route handlers
(defroutes app-routes
  (context "/api/item" [] routes-api-items/routes))

;; define the ring application
(def app
  (-> (handler/api app-routes)
      (middleware/wrap-json-body)
      (middleware/wrap-json-params)
      (middleware/wrap-json-response)))

route handler函数实际上只是返回一个map,因此它的代码非常简单,我想我可以省去它。如果从compojure路由处理程序返回映射是个问题,那么可能就是这个问题?

请检查。基本上,如果您返回
{:body{:mymap“hello”}
,那么它就可以正常工作。

在编写RESTAPI时,Stumbe遇到了类似的问题

当处理程序返回向量时,我得到一个异常,即compojure中的Renderable协议中并没有实现PersistentVector的方法render

返回映射时,标题为空

当返回序列时,我得到“text/html”。 所以,我认为在我们的代码中具有可扩展的可渲染性是很好的:clojure提供了非常好的礼物

但是,作为黑客,对于快速解决方案,我使用下一个中间件:

(defn wrap-content-json [h]
  (fn [req] (assoc-in (h req) [:headers "Content-Type"] "application/json")))

谢谢你这么说,我当时正在拔头发。这真的应该有更好的文档记录。知道为什么它必须包装在:body中吗?我最好的猜测是因为该方法可以允许更多的选项,而不是响应的主体,因此它要求您隐式指定
{:body{}}
。需要这样做的原因是Compojure和Ring(隐式)期望HTTP响应。它们自动处理简单类型的事实是造成混淆的原因。注意,你指的是哪个提交哈希?