我正在学习用 clojure 编写一个简单的 rest api,它只是通过 REST API 提供一些数据作为 mysql db 的中间件。
我按照一些教程设置了我的 Ring 服务器,将 Clojure 数据转换为 JSON。我的项目有以下依赖项:
; middleware
[compojure "1.6.2"]
[ring/ring-defaults "0.3.2"]
[ring/ring-json "0.5.1"]
[ring-cors "0.1.13"]
; API
[clj-http "3.12.3"]
[cheshire "5.11.0"]
; MYSQL
[org.clojure/clojure-contrib "1.2.0"]
[org.clojure/java.jdbc "0.7.12"]
[mysql/mysql-connector-java "8.0.33"]]
我的主要处理程序文件有如下内容:
(defroutes app-routes
(GET "/get-data" [type] (api/get-users type)))
(def app
(-> app-routes
(wrap-cors :access-control-allow-origin [#".*"]
:access-control-allow-methods [:get :put :post :delete])
(middleware/wrap-json-body {:key-fn keyword})
(middleware/wrap-json-response)))
只要返回数据是惰性序列,一切都会正常工作。我可以 curl url 并获取有效的 json 数组。但是当响应只是一个没有数组的 json 对象时,我会得到空响应。我尝试打印数据,正确的数据正在从数据库中顺利获取。然后我尝试打印每种响应类型的数据类型,结果有不同的类型。
clojure.lang.LazySeq
-> 有效,我得到了有效的 json 响应。但是clojure.lang.PersistentArrayMap
-> 无效,我得到了一个空的响应。
当我在将数据返回到浏览器之前打印数据时,我得到了以下信息:
对于 lazySeq:
({:id spanish-chorizo-paella, :name Spanish chicken & chorizo paella})
// ^ this works fine and I get a JSON array in response
对于 PersistentArrayMap:
{:latest 202410-hu, :past [{:id 202212-nl-ch-fr}]}
// ^ This doesn't work and I get an empty response in browser
我需要做些什么来让环服务器检测并转换第二种类型以正确发送为 json?