11

我正在尝试在我的 compojure 应用程序中使用 ring-json 的 wrap-json-response 中间件。我有一个简单的 GET 处理程序,它返回一个地图,比如{:foo 1},当我点击 URL 时,环会响应text/plain和一个空的响应体。我似乎无法让它响应地图的 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)))

路由处理函数实际上只是返回一个地图,所以代码很简单,我想我可以省略。如果从组合路由处理程序返回地图是问题所在,那么也许就是这样?

4

2 回答 2

15

看看这个。基本上,如果您返回{:body {:my-map "hello"}},那么它将正常工作。

于 2013-02-15T09:27:40.777 回答
1

在编写 REST API 时遇到类似的问题。

当处理程序返回向量时,我得到异常,即在 Compojure 的 Renderable 协议中没有实现 PersistentVector 的方法渲染。

返回地图时,标题为空。

返回序列时,我得到'text/html'。所以,我认为在我们的代码中扩展 Renderable 是很好的:来自 clojure 的非常好的礼物。

但是,作为 hack,为了快速解决方案,我使用下一个中间件:

(defn wrap-content-json [h]
  (fn [req] (assoc-in (h req) [:headers "Content-Type"] "application/json")))
于 2016-01-10T21:59:20.173 回答