ring-json的wrap-json-response中间件和compojure返回text / plain?

时间:2013-02-15 04:42:25

标签: clojure compojure ring

我正在尝试在我的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)))

路由处理函数字面上只返回一个映射,所以代码很简单,我想我可以省略。如果从compojure路由处理程序返回一个映射是问题,那么可能就是这样吗?

2 个答案:

答案 0 :(得分:15)

结帐this。基本上如果你返回{:body {:my-map "hello"}}那么它会正常工作。

答案 1 :(得分:1)

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

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

返回地图时,标题为空。

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

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

func say (greeting greeting: String, toName: String){
    print("\(greeting), \(toName)!")
}

say (greeting: "Goodbye", toName: "Hollywood")