【问题标题】:Getting a clojure map with keywords from a POST using Liberator使用 Liberator 从 POST 获取带有关键字的 clojure 映射
【发布时间】:2015-04-16 00:17:23
【问题描述】:

我正在使用 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

cheshire 将参数转换为地图,但键不是关键字:我得到{email test@foo.com, code xyz} 作为输出,而不是希望得到的{:email test@foo.com, :code xyz}

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

【问题讨论】:

    标签: clojure ring liberator immutant


    【解决方案1】:

    您需要利用 ring 的 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)。无需根据请求转换它们。这将处理所有请求。

    【讨论】:

      【解决方案2】:

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

      (cheshire/parse-string params true)
      

      【讨论】:

      • 我推荐使用 ring 的 wrap-keyword-paramswrap-params 中间件。这要枯燥得多,因为您必须在 liberator 中为每个决定解析参数。而对于环中间件,这是针对每个请求完成的。因此,在每个决策中都已转换并可访问。
      【解决方案3】:

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

      【讨论】:

      • 我确实尝试过,但中间件不会影响我从 Liberator 上下文结果中获取的数据。
      • 中间件方法的优点是您不必从响应正文中获取数据。环中间件会为你处理好这些。您可以从已经在解放者上下文中的地图中获取参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2014-08-25
      相关资源
      最近更新 更多