我可以轻松地从获取请求中提取参数
(GET "/:id" [id] (encode {:foo "bar" :baz id})))
但我不能对帖子请求做同样的事情。 例如,我有这样的json
{"title": "some", "description": "another"}
这不起作用:
(POST "/" [title description] (insert-post title description))
如何处理邮寄申请?如果它可以促进这个过程,我应该使用Liberator还是其他lib?
答案 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)