2013-02-15 33 views
9

Tôi đang cố gắng sử dụng phần mềm trung gian phản hồi bọc-json của ring-json trong ứng dụng tương tác của tôi. Tôi có một trình xử lý GET đơn giản trả về một bản đồ, như {:foo 1} và khi tôi nhấn URL, vòng phản hồi với text/plain và một nội dung phản hồi trống. Tôi không thể làm cho nó phản ứng với phiên bản JSON của bản đồ.middle-wrap-json-wrap-json-phản hồi middleware và compojure trả về văn bản/đồng bằng?

Dưới đây là code xử lý của tôi:

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

Chức năng xử lý tuyến đường theo nghĩa đen chỉ trả về một bản đồ, do đó mã cho rằng đơn giản là đủ mà tôi nghĩ rằng tôi có thể bỏ qua. Nếu trả lại một bản đồ từ một bộ xử lý tuyến tính compojure là vấn đề, thì có lẽ đó là nó?

Trả lời

13

Khám phá this. Về cơ bản, nếu bạn trả lại {:body {:my-map "hello"}} thì nó sẽ hoạt động tốt.

+3

Cám ơn anwser này, tôi đã kéo tóc của tôi ra. Điều này thực sự cần phải được tài liệu tốt hơn. –

+0

Bất kỳ ý tưởng nào tại sao nó phải được bọc trong: cơ thể? –

+2

Dự đoán tốt nhất của tôi là vì phương pháp này có thể cho phép nhiều tùy chọn khác hơn so với phần thân của phản hồi, vì vậy nó yêu cầu bạn chỉ định rõ ràng '{: body {}}'. – film42

1

Vấn đề tương tự Stumbe, khi viết REST API.

Khi xử lý trở lại vectơ, tôi nhận ngoại lệ mà không thực hiện phương thức hiển thị cho PersistentVector trong giao thức có thể hiển thị trong compojure.

Khi bản đồ trả lại, tiêu đề trống.

Khi chuỗi trả lại, tôi nhận được 'text/html'. Vì vậy, tôi nghĩ rằng nó là tốt để được mở rộng Renderable trong mã của chúng tôi: món quà thực sự tốt đẹp từ clojure.

Nhưng, như hack, để giải quyết nhanh chóng, tôi sử dụng middleware tiếp theo:

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