我有一个 defresource,应该接受 POST 请求,在 :malformed-decision 中验证请求正文,在 :post!-decision 中将正文保存到数据库中,然后在 :handle-created 中返回保存的正文。
(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 ...))
所以我的代码使用 slurp 函数读取了 ByteArrayInputStream(来自 :request :body)的三倍。第一次有效,但第二次调用 slurp 时,nil 作为参数传递并出现 java.io.EOFException: JSON 错误。我认为读者开始阅读上次离开的地方。
我怎么能读三遍请求的正文?或者有没有很好的方法将读取结果保存到变量并将其传递给其他解放者决策?