如何解决Ring wrap-json-body 不是将 json 数据转换为关键字映射,而是转换为字符串映射
在大约 10 多年前适度涉足 clojure 之后,我又回到了 clojure,所以我可能在这里做了一些愚蠢的事情。
我正在尝试使用 compojure
和 ring
服务器编写一个简单的 API,现在我已经将我的问题隔离在几行代码中。我有一个路由和一个处理程序,并且我在 wrap-json-body
文档中用 ring-json
包裹了我的处理程序。suggested。
我的handler.clj
是这样的:
(defroutes app-routes
(PUT "/item/:id" {{id :id} :params body :body} (str id "," body))
(route/not-found "Not Found"))
(def app
(-> app-routes
(middleware/wrap-json-body)
(middleware/wrap-json-response)))
这应该足够简单了,我可以将 clojure 数据作为 json 返回 OK。问题是当我尝试读取 PUT
请求正文 json 时。
$ curl -XPUT -H "Content-type: application/json" -d '{ "id": 32,"name": "pad" }' 'localhost:3001/item/5'
5,{"id" 32,"name" "pad"}
我希望 body
填充有 {:id 32 :name "pad"}
这是整个请求对象:
; (PUT "/item/:id" body (str id body))
$ curl -XPUT -H "Content-type: application/json" -d '{ "id": 32,"name": "pad" }'
{:ssl-client-cert nil,:protocol "HTTP/1.1",:remote-addr "0:0:0:0:0:0:0:1",:params {:id "5"},:route-params {:id "5"},:headers {"user-agent" "curl/7.58.0","host" "localhost:3001","accept" "*/*","content-length" "27","content-type" "application/json"},:server-port 3001,:content-length 27,:compojure/route [:put "/item/:id"],:content-type "application/json",:character-encoding "UTF-8",:uri "/item/5",:server-name "localhost",:query-string nil,:body {"id" 32,"name" "pad"},:scheme :http,:request-method :put}
我已经对它进行了一些调整并将其更改为一些内容,但似乎无法让 :body
填充关键字ed clojure 数据。
请问我做错了什么?
ps:如果您想查看此问题的有效示例,我已将其上传到 github
解决方法
在 wrap-json-body 中使用 keywords?
参数:
(middleware/wrap-json-body app-routes {:keywords? true})
或者,从 ring-clojure 版本 0.5.1 开始,您可以指定自定义 key-fn
来转换映射的键:
(middleware/wrap-json-body app-routes {:key-fn keyword})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。