【问题标题】:Multiple clojure-liberator decisions reads request body多个 clojure-liberator 决策读取请求正文
【发布时间】:2015-09-30 22:44:05
【问题描述】:

我有一个 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-function 读取了 ByteArrayInputStream(来自 :request :body)的三倍。第一次有效,但第二次调用 slurp 时,nil 作为参数传递并出现 java.io.EOFException: JSON 错误。我认为读者会从上次离开的地方开始阅读。

我怎么能读三遍请求的正文?或者有没有很好的方法将读取结果保存到变量并将其传递给其他解放者决策?

【问题讨论】:

    标签: clojure java-io liberator slurp


    【解决方案1】:

    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

    【讨论】:

    • 很抱歉从死里复活,但至少在 Liberator 0.15.x 中,格式错误的?-函数应该在请求有效时返回 false,所以你不能只返回像 @ 这样的真实值987654330@。相反,如果请求有效并且要更新上下文,则需要返回 [false {:project project}],如果请求无效,则需要返回 true
    猜你喜欢
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2017-08-18
    • 2021-03-24
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多