1

我通过 POST 使用发送地图cljs-http,我想用 Compojure POST 处理程序接收它并将其存储在数据库中。我对在运输途中应该如何处理地图感到完全困惑......有很多选择...... pr-str,,prn等等read-string。在发送方,它似乎cljs-http可能会将我的地图强制转换为 edn。如果没有工作的 Compojure 处理程序,我无法知道。实际上,老实说,我对 edn 是什么还有些不清楚。我收集的是 Clojure 的数据格式。据我所知,我正在处理的实际上只是将 edn 转换为字符串格式,以便发送和返回。但是,请求上的 :data 值是一个对象,而不是字符串。一个工作示例cljs-httpPOST 和允许我使用客户端发送的原始地图的 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 应用程序和服务器之间发送地图的最佳方式是什么?”。我只需要能够将地图发送到服务器,并向该服务器发出请求并拿回地图。

4

1 回答 1

3

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

根据文档cljs-http使用 Transit+JSON 发布请求,content-typeapplication/transit+json

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

在符合Ring的服务器中,您通常会使用中间件来处理内容格式协商、内容编码和解码。你可以使用支持 JSON、EDN 和 Transit 的metosin/muuntaja 。有一个代码示例显示了如何在符合环的服务器的上下文中使用它。

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

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

于 2021-05-05T10:19:42.003 回答