Ring wrap-json-body 没有将 json 数据转换为关键字映射,而是转换为字符串映射
Ring wrap-json-body is not converting json data to keyword map, but to a string map
在大约 10 多年前适度涉足 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)))
这应该很简单,我可以 return 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
填充关键字编辑的 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})
在大约 10 多年前适度涉足 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)))
这应该很简单,我可以 return 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
填充关键字编辑的 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})