Как получить данные 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.

Другие вопросы по тегам