Давайте предположим, что у меня есть конечная точка POST /endpoint
, который принимает JSON в качестве входных данных:Clojure Освободитель: получить тело запроса дважды
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
из запроса, проверьте, если он действителен (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?
по номеру ... - Использование атомов.
Спасибо!
Спасибо @ DanielCompton! – andrusieczko