首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理url数组的Clojure环中间件

处理url数组的Clojure环中间件
EN

Stack Overflow用户
提问于 2016-12-13 23:10:36
回答 2查看 281关注 0票数 7

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

例如:

代码语言:javascript
复制
(http/get "http://example.com" {:b [1 2]})

导致请求:

代码语言:javascript
复制
"http://example.com?b[0]=1&b[1]=2"

我如何设置我的环中间件来在服务器端处理这种格式?我想把它转换回原来的结构:

代码语言:javascript
复制
{:b [1 2]}

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

代码语言:javascript
复制
(ring.middleware.keyword-params/wrap-keyword-params)
(ring.middleware.params/wrap-params :encoding encoding)
(ring.middleware.nested-params/wrap-nested-params)
EN

回答 2

Stack Overflow用户

发布于 2016-12-22 14:56:25

在中间件方面没有问题。问题出在cljs-ajax's ajax.core/params-to-str接口中。它正在为不同的数据格式生成重复的URL。

代码语言:javascript
复制
(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
EN

Stack Overflow用户

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41124417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档