Промежуточное ПО промежуточного слоя wrap-json-response ring-json и compojure возвращает text / plain?

Я пытаюсь использовать промежуточное ПО ring-json wrap-json-response в моем приложении compojure. У меня есть простой обработчик 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, то, может быть, все?


person Ryan    schedule 15.02.2013    source источник


Ответы (2)


Ознакомьтесь с этим. Обычно, если вы вернете {:body {:my-map "hello"}}, он будет работать нормально.

person Ankur    schedule 15.02.2013
comment
Спасибо за этот ответ, я выдергивала волосы. Это действительно следовало лучше задокументировать. - person jd.; 18.03.2013
comment
Есть идеи, почему его нужно обернуть внутри: body? - person Teo Choong Ping; 18.07.2013
comment
Я предполагаю, что этот метод может допускать больше параметров, кроме тела ответа, поэтому он требует, чтобы вы неявно указали {:body {}}. - person film42; 26.09.2013
comment
Причина, по которой это необходимо, заключается в том, что Compojure и Ring (неявно) ожидают ответа HTTP. Тот факт, что они автоматически обрабатывают простые типы, является источником путаницы. См. мой ответ на несколько -связанный вопрос. - person Kenny Evitt; 12.07.2014
comment
Какой хеш коммита вы имели в виду? - person opyate; 31.05.2015
comment
по умолчанию строка преобразуется в ответ {: status 200,: body string}. но ваш обработчик может захотеть явно вернуть ответ с другими интересными свойствами, например кодами состояния, отличными от 200 (400, 301 и т.д.), интересными заголовками и так далее. Поскольку ответ также является просто картой, это было бы невозможно, если бы все карты рассматривались как тело ответа OK json. - person ealfonso; 17.08.2016

Похожая проблема возникает при написании REST API.

Когда обработчик возвращает вектор, я получаю исключение, что в compojure нет реализации метода рендеринга для PersistentVector в протоколе Renderable.

При возврате карты заголовки пусты.

При возврате последовательности я получаю текст / html. Итак, я считаю, что расширение Renderable в нашем коде - это хорошо: действительно хороший подарок от clojure.

Но в качестве взлома для быстрого решения я использую следующее промежуточное ПО:

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