如何从compojure中的post请求中提取json数据?

时间:2014-12-19 21:31:34

标签: clojure

我可以轻松地从获取请求中提取参数

(GET "/:id" [id] (encode {:foo "bar" :baz id})))

但我不能对帖子请求做同样的事情。 例如,我有这样的json

{"title": "some", "description": "another"}

这不起作用:

(POST "/" [title description] (insert-post title description))

如何处理邮寄申请?如果它可以促进这个过程,我应该使用Liberator还是其他lib?

2 个答案:

答案 0 :(得分:1)

您可以使用以下绑定访问帖子数据:

(POST "/" {:keys [params]}
  (insert-post params))

或者,如果你想让你的json数据被破坏

(POST "/" {:keys [params]}
  (let [{:keys [title description]} params]
    (insert-post title description)))

不要忘记添加适当的环中间件来解析你的json体,例如wrap-json-params from ring-json module,因为wrap-params middleware中包含的默认all compojure build-in handlers仅解析了urlencoded数据:

(def app
  (-> (handler/site your-routes)
      wrap-json-params))

答案 1 :(得分:0)

问题在于数据。我的帖子请求包含body参数中的数据(不在查询路径中)。我只需要读取链:请求,然后是正文。我还需要将InputStream中的body解码为字符串,我使用了一个非常方便的函数slurp。

我现在也在使用解放器,这就是为什么我的解决方案看起来像(注意application / json):

(defroutes app
  (ANY "/posts" []
    (resource
      :allowed-methods [:post :get]
      :available-media-types ["text/html" "application/json"]
      :handle-ok (fn [ctx](...omitted))
      :post! (fn [ctx] (println (-> ctx :request :body slurp decode)))
      ...))

这解决了这个问题 ( - > ctx:request:body slurp decode)