Как получить данные JSON в Noir
Некоторое время назад Крис Грэйнджер опубликовал это промежуточное программное обеспечение, чтобы хэши JSON отображались в параметрах defpage под элементом "основы" зонтика.
(defn backbone [handler]
(fn [req]
(let [neue (if (= "application/json" (get-in req [:headers "content-type"]))
(update-in req [:params] assoc :backbone (json/parse-string (slurp (:body req)) true))
req)]
(handler neue))))
Как я могу изменить этот код, чтобы элементы JSON отображались как параметры верхнего уровня в defpage; т.е. избавиться от: зонт позвоночника?
3 ответа
Есть две вещи, которые вы можете сделать. Одним из вариантов является замена значения :params
с картой, возвращенной после анализа JSON. Для этого просто свяжите новую карту с :params
ключ.
(assoc req [:params] (json/parse-string (slurp (:body req)) true))
Другой вариант (как предложено @dAni) - объединить значения проанализированного JSON в существующие значения в :params
карта не переопределена. Причина, по которой вам нужно использовать partial
вместо того, чтобы просто использовать merge
здесь, потому что окончательная карта - это объединенный результат карт слева направо. Ваше решение работает, если вы хотите, чтобы значения из карты JSON имели приоритет.
(update-in req [:params]
(partial merge (json/parse-string (slurp (:body req)) true)))
Понял. assoc
просто работает для одного элемента, поэтому вы должны поместить все под :backbone
зонтик. Чтобы вставить все элементы JSON в параметры, вы должны использовать merge
, Поэтому измените 4-ю строку на:
(update-in req [:params] merge (json/parse-string (slurp (:body req)) true))
Если вы не против добавить другую зависимость, вы можете использовать библиотеку ring-middleware-format.
Инструкции:
добавлять
[ring-middleware-format "0.1.1"]
на вашproject.clj
а затем в вашем
server.clj
добавьте следующий код:
Код:
(:require [ring.middleware.format-params :as format-params])
(server/add-middleware format-params/wrap-json-params)
(defn -main [& m]
; Start the server...
)
Теперь любой входящий JSON будет доступен для использования точно так же, как и форма POSTdata.