2013-02-15 2 views
9

내 compojure 앱에서 ring-json의 wrap-json-response 미들웨어를 사용하려고합니다. {:foo 1} 같은지도를 반환하는 간단한 GET 처리기가 있고 URL을 누를 때 반지는 text/plain 및 빈 응답 본문으로 응답합니다. JSON 버전의지도로 응답 할 수없는 것 같습니다.ring-json의 wrap-json-response 미들웨어 및 compojure가 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))) 

경로 핸들러 함수는 말 그대로 단지지도를 반환, 그래서의 코드 내가 떠날 수 있다고 생각만큼 간단합니다. compojure 라우트 핸들러에서 맵을 반환하는 것이 문제라면, 아마도 그게 맞습니까?

답변

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