Получение карты clojure с ключевыми словами из POST с использованием Liberator
Я использую Liberator и с трудом переношу свои POST-данные на карту, используя ключевые слова в качестве ключей. Вот мой ресурс с несколькими печатными строками для тестирования:
(defresource finish_validation
:allowed-methods [:post]
:available-media-types ["application/json"]
:post! (fn [context]
(let [params (slurp (get-in context [:request :body]))
mapped_params (cheshire/parse-string params)]
(println (type params))
(println (type mapped_params))
(validation/finish mapped_params)))
:handle-created (println ))
Для тестирования я публикую данные с помощью curl:
curl -H "Content-Type: application/json" -X POST -d '{"email":"test@foo.com","code":"xyz"}' http://localhost:8080/validate
Чешир преобразует параметры в карту, но ключи не являются ключевыми словами: я получаю {email test@foo.com, code xyz}
в качестве выхода, вместо того, чтобы {:email test@foo.com, :code xyz}
,
Должен ли я делать что-то по-другому? Это даже правильный подход к получению данных?
3 ответа
Вы должны использовать кольцо wrap-params
промежуточное программное обеспечение в сочетании с wrap-keyword-params
промежуточное ПО, которое преобразует карту параметров в карту ключей.
(ns your.namespace
(:require [ring.middleware.params :refer [wrap-params]]
[ring.middleware.keyword-params :refer [wrap-keyword-params]]))
(def app
(-> some-other-middleware
wrap-keyword-params
wrap-params))
Используя это промежуточное ПО с wrap-params
преобразует параметры для использования ключей. После добавления этого промежуточного программного обеспечения вы можете получить доступ к своим параметрам из карты запросов, например, так (-> ctx :request :params)
, Не нужно конвертировать их по запросу. Это обработает все запросы.
Мне просто нужно было поставить "true" в конце вызова функции Чешир, и ключи возвращаются в виде ключевых слов:
(cheshire/parse-string params true)
В зависимости от ваших требований вы можете упростить обработку ваших почтовых данных, используя различное промежуточное программное обеспечение. Это позволит вам обрабатывать данные JSON в одном месте и избавлять от необходимости дублировать обработку данных в каждом из ваших определений обработчиков / ресурсов. Есть несколько способов сделать это. Вы можете добавить данные json в качестве ключевых параметров на карту параметров или в карту json-params. Взгляните на ring.middleware.format и ring.middleware.json.