多个clojure解放者决定读取请求体
我有一个defresource,它应该接受POST请求,在:畸形决策中验证请求主体,在:POST中将主体保存到数据库中-决策并返回保存的实体:handle created多个clojure解放者决定读取请求体,clojure,java-io,liberator,slurp,Clojure,Java Io,Liberator,Slurp,我有一个defresource,它应该接受POST请求,在:畸形决策中验证请求主体,在:POST中将主体保存到数据库中-决策并返回保存的实体:handle created (defn parse-project [context] (json/read-str (slurp (get-in context [:request :body])) :key-fn keyword
(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错误。我想读者是从上次留下的地方开始阅读的
我怎么能把请求的正文读三遍呢?或者有没有好办法保存读取变量的结果并将其传递给其他解放者决策?可以通过每个决策和操作函数的结果更新
上下文。您可以在格式错误?
中分析项目一次,并返回一个包含已分析项目的映射,该映射将被合并到上下文中,以便可用于以下决策和操作。例如:
(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))))
如果项目有效,:格式错误?
返回{:project-project}
映射,该映射将合并到上下文中,以便在下一个决策和操作中使用。
如果项目无效,它将返回nil
,以便在:handle-moreformed
中继续执行
有关liberator的执行模型的更多信息,请参见很抱歉,这是死里逃生,但至少在liberator 0.15.x中,当请求有效时,格式错误的?-函数应该返回false
,因此不能只返回像{:project}
这样的真实值。相反,如果请求有效并且要更新上下文,则需要返回[false{:project}]
,如果请求无效,则需要返回true
。