Clojure环中间件处理URL阵列



clojurescript cljs-ajax客户端库将 {:b [1 2]}转换为 b[0]=1&b[1]=2

例如:

(http/get "http://example.com" {:b [1 2]})

导致请求:

"http://example.com?b[0]=1&b[1]=2"

如何设置戒指中间件以在服务器端处理此格式?我想将其转换回原始结构:

{:b [1 2]}

我正在使用下面的中间件,但它无法正常工作:

(ring.middleware.keyword-params/wrap-keyword-params)
(ring.middleware.params/wrap-params :encoding encoding)
(ring.middleware.nested-params/wrap-nested-params)

中间软件侧没有任何问题。问题在于CLJS-AJAX的ajax.core/params-to-str API。它正在为不同的数据格式生成重复的URL。

(ajax.core/params-to-str {:b [1 3]})
;; => "b[0]=1&b[1]=3"
(ajax.core/params-to-str {:b {0 1 1 3}})
;; => "b[0]=1&b[1]=3"

对于数组,格式应为 b[]=1&b[]=3

我建议中间件工作正常,但是也许它的工作与您的期望之间存在不对对准。我假设您所拥有的只是中间件的列表,而不是您的调用/使用方式。如果没有,您会离开赛道。

严格来说,您要通过的不是嵌套参数。您真正拥有的是具有" B [0]"one_answers" B [1]"之类的名称的参数,每个名称都有一个值。这是因为您使用的而不是发布,而CLJS-AJAX需要将您的clojure数据结构转换为普通查询参数格式。除非有充分的理由这样做,否则如果您使用帖子方法而不是将数据嵌入到JSON/EDN/TRASSIT中,那么您会发现生活会更轻松。它还具有额外的好处,即您的数据将不会作为URL的一部分发送"公共",并在整个地方被日志捕获。

与cljs-ajax一起使用的有用的服务器端软件包,post命令是ring.middleware.format。这将简化请求正文中数据的解析,并支持多个不同的数据编码方法。

最新更新