使用Liberator从帖子中获取包含关键字的clojure地图

使用Liberator从帖子中获取包含关键字的clojure地图,clojure,ring,liberator,immutant,Clojure,Ring,Liberator,Immutant,我使用的是Liberator,很难用关键字作为键将我发布的数据放到地图中。以下是我的参考资料,其中有一些用于测试的打印行: (defresource finish_validation :allowed-methods [:post] :available-media-types ["application/json"] :post! (fn [context] (let [

我使用的是Liberator,很难用关键字作为键将我发布的数据放到地图中。以下是我的参考资料,其中有一些用于测试的打印行:

(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
cheshire将参数转换为地图,但键不是关键字:I get
{emailtest@foo.com,code xyz}
作为输出,而不是希望的
{:emailtest@foo.com,:code xyz}

我应该做些不同的事情吗?这是获取数据的正确方法吗?

我只需在对cheshire函数的调用末尾加上“true”,键作为关键字返回:

(cheshire/parse-string params true)

根据您的需求,您可以使用各种环形中间件简化post数据的处理。这将允许您在一个位置处理json数据,并消除在每个处理程序/资源定义中重复数据处理的需要。有几种方法可以做到这一点。您可以将json数据作为关键字参数添加到参数映射或json参数映射中。看一看,看一看

您需要利用ring的中间件,以及将参数映射转换为密钥映射的中间件

(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))

将此中间件与
包装参数一起使用
将参数转换为使用键。添加此中间件后,您可以从请求映射访问参数,如so
(->ctx:request:params)
。无需根据请求转换它们。这将处理所有请求。

我确实尝试过,但中间件不会影响我从Liberator上下文结果中提取的数据。中间件方法的优点是不必从响应体提取数据。戒指中间件会帮你处理的。您可以从已经在liberator上下文中的映射中获取参数。我建议利用ring的
wrap关键字params
wrap params
中间件。这要枯燥得多,因为您必须在liberator中为每个决策解析参数。而使用环形中间件,则可以对每个请求执行此操作。因此,在每个决策中都已转换并可访问。