2014-05-18 56 views
6

我正努力從放入中返回JSON!要求:clojure解放者 - 從放入請求返回json

我的代碼如下所示:

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

我只是想返回傳遞給PUT請求早在JSON,直到我明白是怎麼回事什麼。

但是,如果我做一個PUT請求,我得到如下回應:

HTTP/1.1 201創建

日期:太陽2014年5月18日15時35分32秒GMT

內容類型:文本/無格式

的Content-Length:0

服務器:碼頭(7.6.8.v20121106)

我的GET請求返回的JSON,所以我不明白爲什麼PUT請求不是/

回答

6

這是因爲全成PUT請求不返回HTTP 200狀態碼(至少根據解放者) ,它會返回一個http 201狀態碼,正如您從響應中看到的那樣。 Liberator處理每個不同處理程序中的http狀態碼。爲了達到你想要什麼,你要做的:

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

既然你沒有申報的:處理創建的,則默認爲使用text/plain的內容類型爲空字符串。

編輯:

爲了瞭解更多,你還得看decision graph。在那裏,你可以看到在處理完put!之後,它進入決策處理new?,如果它是真的,則轉到handle-created,如果否,則轉到respond-with-entity?等等。

+1

它可以真正幫助添加Liberator wrap-trace中間件。然後,您將在答覆中獲得X-Liberator標題,以顯示解放者在各個決策點的狀態。它還顯示你使用了哪個處理程序。在這種情況下,它會顯示正在使用默認的手柄創建。 –