2013-02-15 10 views
9

私はcomp-jsonのwrap-json-responseミドルウェアをcompojure app内で使用しようとしています。私は{:foo 1}のようなマップを返す単純なGETハンドラを持っています。そしてURLをヒットすると、リングはtext/plainと空のレスポンスボディで応答します。私はマップのJSONバージョンで応答するようには思えません。ring-jsonのwrap-json-responseミドルウェアとコンポジットはtext/plainを返しますか?

ここに私のハンドラのコードです:

(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))) 

ルートハンドラ関数は、文字通りマップを返すので、そのためのコードは、私が出て残すことができると考えていることは十分に簡単ですが。コンポジットルートハンドラからマップを返すことが問題ならば、それはおそらくそれでしょうか?

答えて

13

チェックアウトthis基本的には{:body {:my-map "hello"}}を返すと問題なく動作します。

+3

感謝を。これは本当によく文書化されているはずです。 –

+0

なぜそれは包み込まれなければならないか考えてください:体? –

+2

私の推測では、メソッドがレスポンスの本体以外の多くのオプションを許可する可能性があるため、暗黙的に '{:body {}} 'を指定する必要があります。 – film42

1

REST APIを記述する際に同様の問題が発生します。

ハンドラリターンベクタの場合、コンポジットのRenderableプロトコルでPersistentVectorのメソッドの実装が行われないという例外があります。

リターンマップの場合、ヘッダーは空です。

返される順番は、「text/html」です。 私は、コードでRenderableを拡張するのが良いと思います:clojureからの本当に素敵な贈り物です。

しかし、ハックとして、高速なソリューションのために、私は次のミドルウェアを使用します。私は私の髪を引っ張った、このanwserのため

(defn wrap-content-json [h] 
    (fn [req] (assoc-in (h req) [:headers "Content-Type"] "application/json"))) 
関連する問題