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)
答案 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。这将简化请求正文中的数据解析,并支持多种不同的数据编码方法。