我有一个 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 错误。我认为读者会从上次留下的地方开始阅读。
如何将请求正文读三遍?或者有没有好的方法将读取结果保存到变量并将其传递给其他解放者决策?
最佳答案
上下文
可以通过每个决策和操作函数的结果进行更新。您可以在格式错误?
中解析项目一次,并返回包含已解析项目的 map ,该项目将合并到上下文中,以便可用于以下决策和操作。例如:
(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
关于clojure - 多个 clojure-liberator 决策读取请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31370321/