2

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

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

4

3 回答 3

2

您需要利用 ring 的wrap-params中间件,以及wrap-keyword-params将 params map 转换为 key map 的中间件。

(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)。无需根据请求转换它们。这将处理所有请求。

于 2015-04-18T00:33:51.247 回答
1

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

(cheshire/parse-string params true)
于 2015-04-16T00:53:24.027 回答
0

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

于 2015-04-17T02:13:40.850 回答