2013-02-15 9 views
9

Próbuję użyć oprogramowania pośredniego typu wrap-json typu wrap-json w mojej aplikacji compojure. Mam prosty handler GET, który zwraca mapę, np. {:foo 1}, a po kliknięciu adresu URL pierścień odpowiada text/plain i pustym ciałem odpowiedzi. Nie mogę sprawić, żeby odpowiedziała wersją mapy JSON.Oprogramowanie pośredniczące wrap-json-wrap-json-response i compojure zwraca tekst/zwykły?

Oto mój kod obsługi:

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

Funkcja obsługi trasy dosłownie zwraca mapę, więc kod, który jest na tyle prosta, że ​​myślę, że mógłby opuścić. Jeśli zwróceniem mapy z compojure obsługa trasy jest problem, to może to wszystko?

Odpowiedz

13

Zapoznaj się z this. Zasadniczo, jeśli zwrócisz {:body {:my-map "hello"}}, to będzie działać poprawnie.

+3

Dzięki tej anwser byłem ciągnięcie moich włosów. To naprawdę powinno być lepiej udokumentowane. –

+0

Każdy pomysł, dlaczego musi być zawijany w: body? –

+2

Moje najlepsze przypuszczenie jest takie, że metoda może pozwolić na więcej opcji poza treścią odpowiedzi, więc wymaga niejawnego określenia '{: body {}}'. – film42

1

Stumbe podobny problem podczas pisania REST API.

Kiedy wektor zwrotny obsługi, otrzymuję wyjątek, że żadna implementacja metody renderowania dla PersistentVector w Renderable Protocol w compojure.

Po odwróceniu mapy nagłówki są puste.

Po powrocie otrzymuję komunikat "text/html". Uważam, że dobrze jest przedłużyć Renderowalność w naszym kodzie: naprawdę miły prezent od clojure.

Ale, jak włamania, do szybkiego rozwiązania, używam następny middleware:

(defn wrap-content-json [h] 
    (fn [req] (assoc-in (h req) [:headers "Content-Type"] "application/json"))) 
Powiązane problemy