2015-07-12 75 views
2

我有一個defresource,這應該採取POST請求,驗證請求主體:malformed-decision,將主體保存到數據庫中:post!-decision並返回保存的主體in:手柄創建。多個clojure解放者的決定讀取請求主體

(defn parse-project [context] (json/read-str 
           (slurp (get-in context [:request :body])) 
           :key-fn keyword))  
(defresource add-new-project 
     :malformed? (fn[ctx] (not (project-is-valid (parse-project ctx)))) 
     :handle-malformed (fn [_] (generate-string (str "Malformed json!"))) 
     ... 
     :post! (fn [ctx] (save-to-db (parse-project ctx)) 
     :handle-created (fn [ctx] (... parse-project ...)) 

所以我的代碼讀取三次ByteArrayInputStream(來自:request:body)與slurp函數。第一次工作,但第二次調用slurp時,nil作爲參數傳遞並出現java.io.EOFException:JSON錯誤。我認爲讀者開始閱讀上次留下的位置。

我怎樣才能讀取請求的正文三次?或者,有沒有很好的方法可以將閱讀結果保存到變量中並將其傳遞給其他解放者決策?

回答

3

context可以根據每個決定和行動功能的結果進行更新。您可以在malformed?中解析項目一次,並返回一個包含解析項目的地圖,該項目將被合併到上下文中,以便它可用於以下決策和操作。例如:

(defresource add-new-project 
    :malformed? (fn[ctx] (let [project (parse-project ctx)] 
         (when (project-is-valid project) 
          {:project project}))) 
    :handle-malformed (fn [_] (generate-string (str "Malformed json!"))) 
    :post! (fn [ctx] (save-to-db (:project ctx))) 
    :handle-created (fn [ctx] (do-something (:project ctx)))) 

如果該項目是有效的,:malformed?返回在未來的決策和行動中使用的{:project project}地圖將被合併爲背景。 如果項目無效,它將返回nil,因此執行繼續在:handle-malformed。請參閱https://clojure-liberator.github.io/liberator/doc/execution-model.html

相關問題