Получение карты 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.

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