假设,我有一个POST /endpoint
将 JSON 作为输入数据的端点:
POST /endpoint
{
"resource": {
"name": "great"
}
}
现在,我想检查传入的 JSON 是否有效。我认为那个:malformed?
钩子会是一个很好的地方。
所以我想出了这样一个代码:
(ANY "/endpoint" []
(resource
:allowed-methods [:post]
:available-media-types ["application/json"]
:malformed? (fn [ctx] (let [body (get-body-from-request ctx)
is-malformed (not (is-body-valid body))]
is-malformed)
:post! (fn [ctx] (let [body (get-body-from-request ctx)]
(create-an-object body)))
:handle-created (fn [ctx] {:method :post :body (:body @request)})))
所以我的意图是:
- 获取
body
from 请求,检查它是否有效 (is-body-valid
) - 在
post!
钩子中,body
再次使用并做实际工作(create-an-object
)
这里的问题是get-body-from-request
函数:
(defn get-body-from-request [ctx]
(json/read-str (slurp (get-in ctx [:request :body])) :key-fn keyword))
它工作得很好,但它body
是一个InputStream
,所以我只能读一次。
有没有办法body
在多个不使用原子的钩子中使用请求?
我想到的解决方案:
- 将字符串版本添加
body
到ctx
参数的中间件包装器。 - 将结果传递
malformed?
给post!
... - 使用原子。
谢谢!