如何在 Clojure 中使用 POST 处理程序接收 edn? (以及如何发送)

How do I receive edn using a POST handler in Clojure? (and how do I send it)

我正在使用 cljs-http 通过 POST 发送地图,我想使用 Compojure POST 处理程序接收它并将其存储在数据库中。我完全困惑我应该如何处理运输途中的地图...有很多选择...pr-strprnread-string 等等.在发送端,似乎 cljs-http 可能会强制我的地图自行进入 edn。如果没有有效的 Compojure 处理程序,我无法知道。 其实说实话,我对edn是什么还是有点不清楚。我收集的是 Clojure 的数据格式。据我所知,我正在处理的实际上只是将 edn 转换为字符串格式以供发送和退出。但是,请求中的 :data 值是 object,而不是字符串。 cljs-http POST 和 Compojure POST 处理程序的工作示例允许我使用客户端发送的原始地图,这将是非常棒的。我不知道

:edn-params 的用途
(http/post "/test" (:edn-params (prn-str {:hey "there"})))

或者我是否应该使用其他东西。我习惯了 JSON 并且想知道我是否应该将数据转换为 JSON 并在接收端退出。我不确定使用 edn 的优势。

在接收方我有:

(defroutes handler
  (GET "/about" [] "<h1>Hello World</h1>")
  (POST "/test" req (prn (read (:body req))))
  (route/not-found "<h1>Page not found</h1>"))

我知道这可能是错误的...但我想我会分享我的位置。

更新:经过一番思考,标题应该是“在 Reagent 应用程序和服务器之间发送地图的最佳方式是什么?”。我只需要能够将地图发送到服务器,并且向该服务器发出请求并取回地图。

通常使用 Transit 对 EDN 进行编码以进行 HTTP 传输。支持内容(HTTP 正文)编码和解码在客户端和服务器中很常见。

根据 documentation for cljs-http,到 POST 使用 Transit+JSON 的请求即 content-typeapplication/transit+json:

(http/post "http://example.com" {:transit-params {:key1 "value1" :key2 "value2"}})

Ring-compliant server, you would typically use middleware to deal with content format negotiation, content encoding and decoding. You could use metosin/muuntaja which supports JSON, EDN and Transit. There's a code sample 中展示了如何在 Ring 兼容服务器的上下文中使用它。

EDN 是 Clojure 的一个子集,通常在 Clojure(Script) 程序之间传递值时使用。可以使用 application/edn 作为 HTTP 内容类型,但这样做会错过 JSON 内容所具有的巨大支持和处理优化。

从 EDN 到 JSON 的天真翻译会导致围绕如何处理 Clojure 关键字、集合等问题。 Transit 通过定义可以对任何值进行编码的开放格式(和库)来解决这些问题。特别是,它使 EDN 能够编码为 JSON(或 MessagePack)格式。换句话说,传送的 EDN 在运输过程中搭载在 JSON 上。