Clojure环形中间件用于处理URL数组。

7
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个回答

1

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

0

我建议中间件是运行良好的,但也许它的作用和你的期望有些不一样。我假设你上面列出的只是中间件列表,而不是你如何调用/使用它。如果不是这样,你就走错了路。

严格来说,你试图传递的不是嵌套参数。你真正拥有的是类似于“b[0]”和“b[1]”这样的带有名称的参数,每个参数都有一个值。这是因为你使用的是get而不是post,而cljs-ajax需要将你的clojure数据结构转换为普通查询参数格式。除非有很强的原因去这样做,否则你会发现如果你使用post方法并将数据嵌入json / edn / transit等主体中,生活会更加轻松。它还带有额外的好处,即你的数据不会作为URL的一部分被发送到“公共”区域,并被各种日志捕获。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接