【发布时间】:2021-08-26 03:50:59
【问题描述】:
这个问题是几天前在previous question I asked 后面提出的。其中一个 cmets 是我应该放弃用于提取查询参数的 Ring 中间件并编写自己的。我认为我会使用的一种替代方法是利用现有的来获得我想要的东西,我一直在研究 Ring 源代码。它几乎完全符合我的要求。如果我写出我是如何理解它的工作原理的:
- 中间件具有调用参数请求的函数wrap-params
-
params-request 将
params映射添加到request映射,调用assoc-query-params - assoc-query-params 最终在传入的查询字符串上调用 ring.util.codec/form-decode 将其转换为地图
- form-decode 使用 assoc-conj 通过 reduce 将值合并到现有映射中
- assoc-conj 的文档字符串说
将键与映射中的值相关联。如果密钥已经存在于 映射,值向量与键相关联。
最后一个函数是我上一个问题中存在问题的函数(TL;DR:我希望地图的值在字符串或向量类中保持一致)。戴上面向对象的帽子后,我可以通过子类化和覆盖我需要改变行为的方法来轻松解决这个问题。但是对于 Clojure,我看不到如何只替换一个函数而不必更改堆栈中的所有内容。这可能吗,是否容易,还是我应该以另一种方式这样做?如果涉及到它,我可以复制整个中间件库和编解码器,但对我来说似乎有点重量级。
【问题讨论】: