【问题标题】:Clojure ring middleware to handle url arrayClojure 环中间件处理 url 数组
【发布时间】:2016-12-13 15:10:36
【问题描述】:

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)

【问题讨论】:

    标签: clojure ring


    【解决方案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

    【讨论】:

      【解决方案2】:

      我建议中间件工作正常,但它的作用可能与您的期望不一致。我假设您上面所拥有的只是中间件的列表,而不是您如何调用/使用它。如果没有,你就偏离了轨道。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多