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



我正在使用cljs-http通过POST发送映射,我希望使用Composjure POST处理程序接收它并将其存储在数据库中。我完全困惑于我应该如何处理运输中的地图。。。有很多选择。。。pr-strprnread-string等等。在发送端,似乎cljs-http可能会自行将我的映射强制到edn中。如果没有一个有效的Composjure处理程序,我就无法知道。事实上,老实说,我还不清楚edn是什么。我收集到的是Clojure的数据格式。据我所知,我正在处理的实际上只是将edn转换为字符串格式,以便发货和退回。但是,请求中的:data值是一个对象,而不是字符串。cljs-httpPOST和Composjure 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主体(编码和解码的支持在客户端和服务器中很常见。

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

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

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

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

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

最新更新