我正在使用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将params转换为地图,但键不是关键字:我将{email test@foo.com, code xyz}
作为输出,而不是希望的{:email test@foo.com, :code xyz}
。
我应该采取不同的做法吗?这甚至是获取数据的正确方法吗?
答案 0 :(得分:2)
您需要利用ring的wrap-params
中间件,再加上wrap-keyword-params
中间件,它将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
一起使用可将params转换为使用密钥。添加此中间件后,您可以从请求映射中访问您的参数,如(-> ctx :request :params)
。无需按要求转换它们。这将处理所有请求。
答案 1 :(得分:1)
我只需要把#34; true"在调用cheshire函数结束时,键将作为关键字返回:
(cheshire/parse-string params true)
答案 2 :(得分:0)
根据您的要求,您可以使用各种环中间件简化发布数据的处理。这将允许您在一个位置处理json数据,并且无需在每个处理程序/资源定义中进行重复数据处理。有几种方法可以做到这一点。您可以在参数映射或json-params映射中将json数据添加为关键字化参数。请查看ring.middleware.format和ring.middleware.json。