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)发布于 2016-12-22 14:56:25
在中间件方面没有问题。问题出在cljs-ajax's ajax.core/params-to-str接口中。它正在为不同的数据格式生成重复的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。
发布于 2016-12-22 03:05:26
我会建议中间件工作得很好,但可能在它所做的事情与您的期望之间存在偏差。我假设您上面所拥有的只是一个中间件的列表,而不是您如何调用/使用它。如果不是,你的方式就会偏离正轨。
严格地说,您尝试传递的不是嵌套参数。您真正拥有的是名为"b“和"b1”的参数,每个参数都有一个值。这是因为您使用的是get而不是post和cljs-ajax需要将clojure数据结构转换为普通的查询参数格式。除非有充分的理由这样做,否则如果您使用post方法而不是get并将数据作为json/edn/transit之类的形式嵌入到主体中,您会发现事情变得容易得多。它还有一个额外的好处,那就是你的数据不会作为URL的一部分“公开”发送,也不会被到处都是的日志捕获。
与cljs-ajax和post命令一起使用的一个有用的服务器端包是ring.middleware.format。这将简化请求正文中数据的解析,并支持多种不同的数据编码方法。
https://stackoverflow.com/questions/41124417
复制相似问题