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

ルート ハンドラー関数は文字どおりマップを返すだけなので、そのコードは単純なので省略することもできます。Compojure ルート ハンドラーからマップを返すことが問題である場合、おそらくそれでおしまいでしょうか?

4

2 に答える 2

15

これをチェックしてください。基本的には元に戻せば{:body {:my-map "hello"}}大丈夫です。

于 2013-02-15T09:27:40.777 に答える
1

REST API を作成するときに同様の問題が発生します。

ハンドラーがベクトルを返すと、compojure の Renderable プロトコルで PersistentVector のメソッド render が実装されていないという例外が発生します。

マップを返すとき、ヘッダーは空です。

シーケンスを返すと、「text/html」を取得します。したがって、私たちのコードで Renderable を拡張するのは良いことだと思います。clojure からの本当に素晴らしい贈り物です。

しかし、ハックとして、迅速な解決のために、次のミドルウェアを使用します:

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