Clojure环中间件来处理url数组

时间:2016-12-13 15:10:36

标签: clojure ring

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)

2 个答案:

答案 0 :(得分:1)

中间件方面没有问题。问题出在cljs-ajax's 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

答案 1 :(得分:0)

我建议中间件工作正常,但也许它的作用和你的期望之间存在不一致。我假设你上面的内容只是一个中间件列表,而不是你如何调用/使用它。如果没有,你的方式偏离轨道。

严格地说,您要传递的内容不是嵌套参数。你真正拥有的参数名称如" b [0]"和" b [1]",每个都有一个值。这是因为你使用get而不是post和cljs-ajax需要将你的clojure数据结构转换为普通的查询参数格式。除非有充分理由这样做,否则如果你使用post方法而不是将数据作为json / edn / transit进行嵌入和嵌入,你会发现生活更容易。它还有一个额外的好处,即您的数据不会被发送和公开。作为URL的一部分,并由整个地方的日志捕获。

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