2014-05-18 15 views
6

Tôi đang đấu tranh để trả lại JSON từ một đặt! yêu cầu:clojure liberator - trả lại json từ một yêu cầu đặt

Mã của tôi trông như thế này:

(defn body-as-string [ctx] 
    (if-let [body (get-in ctx [:request :body])] 
    (condp instance? body 
     java.lang.String body 
     (slurp (io/reader body))))) 

(defn orbit-world [dimensions ctx] 
    (let [in (json/parse-string (body-as-string ctx))] 
    (json/generate-string in))) 

(defn init-world [params] 
    (let [dimensions (Integer/parseInt params) 
    world (vec (repeat dimensions (vec (take dimensions (repeatedly #(rand-int 2))))))] 
    (json/generate-string world))) 

(defresource world [dimensions] 
    :allowed-methods [:get :put] 
    :available-media-types ["application/json"] 
    :available-charsets ["utf-8"] 
    :handle-ok (fn [_] (init-world dimensions)) 
    :put! (fn [ctx] (orbit-world dimensions ctx))) 

tôi chỉ đơn giản muốn trở lại bất cứ điều gì mà sẽ được chuyển cho các yêu cầu đặt lại như JSON cho đến khi tôi hiểu những gì đang xảy ra.

Nhưng nếu tôi thực hiện một yêu cầu đặt, tôi nhận được câu trả lời sau đây:

HTTP/1.1 201 Created

Ngày: Chủ nhật, ngày 18 tháng 5 năm 2014 15:35:32 GMT

Content-type: text/plain

Content-Length: 0

server: Jetty (7.6.8.v20121106)

yêu cầu GET của tôi trả về JSON vì vậy tôi không hiểu tại sao các yêu cầu PUT không phải là/

Trả lời

6

Đó là bởi vì một yêu cầu thành công PUT không trả lại một mã trạng thái HTTP 200 (ít nhất là theo giải phóng) , nó trả về mã trạng thái http 201, như bạn có thể thấy từ phản hồi. Liberator xử lý mã trạng thái http mỗi mã trong một trình xử lý khác nhau. Để đạt được những gì bạn muốn, bạn phải làm:

(defresource world [dimensions] 
    :allowed-methods [:get :put] 
    :available-media-types ["application/json"] 
    :available-charsets ["utf-8"] 
    :handle-ok (fn [_] (init-world dimensions)) 
    :put! (fn [ctx] (orbit-world dimensions ctx)) 
    :handle-created (fn [_] (init-world dimensions))) ; Basically just a handler like any other. 

Vì bạn không khai báo trên: xử lý được tạo, nó mặc định là một chuỗi rỗng có loại văn bản/nội dung đơn giản.

Edit:

Để tìm hiểu thêm, bạn có để xem decision graph. Trong đó, bạn có thể thấy rằng sau khi xử lý put! nó đi đến xử lý quyết định new?, nếu đó là sự thật đi đến handle-created nếu sai, hãy truy cập respond-with-entity? v.v.

+1

Nó thực sự có thể giúp thêm phần mềm trung gian theo dấu Liberator. Sau đó, bạn sẽ nhận được các tiêu đề X-Liberator trong các câu trả lời thể hiện trạng thái của người giải phóng tại các điểm quyết định khác nhau. Nó cũng cho bạn thấy trình xử lý nào được sử dụng. Trong trường hợp này, nó sẽ cho thấy rằng mặc định xử lý tạo đã được sử dụng. –

Các vấn đề liên quan