我想在Rook中创建一个参数解析器,它可以对输入进行简单的转换。假设我有一个像/resource/1这样的简单REST URL来获得id 1的资源。但是id以"1"的形式出现,即字符串。我不想在每个端点函数中显式地将id转换为字符串。
我似乎可以用参数解析器来完成这个任务,例如,我尝试了这样的方法:
(def handler (-> (rook/namespace-handler
["resource" 'my-project.resource {'id #(Integer. %)}])
rook/wrap-with-standard-middleware))然后,在资源命名空间中,我已经将id作为整数。
(defn show [id]
; id should now be an integer
(r/response (* id 2)))但是这不起作用,id仍然是一个字符串,解析器永远不会被调用。
发布于 2016-01-28 18:14:53
这里有两个问题:(1)参数解析器是请求的函数;(2)路由params接收特殊的处理,而这些处理目前比其他适用的解析器更优先。
(1)表示争论解决程序必须最终采用以下形式:
(fn [request]
…)-例如,您可以编写一个解析器来解析路由param id --就像这样:
(fn [request]
(-> request :io.aviso.rook.dispatcher/route-params :id Integer/parseInt))参数解析器工厂采用以下形式
(fn [sym]
;; usually there'll be a let form here wrapping the inner fn
(fn [request]
…))sym是要解析的参数的名称(例如,:request-key query-params解析为(:query-params request))。
(2)意味着,从0.1.39版本开始,将其注册为符号id的解析器将无法工作;注册解析器工厂并使用它标记id参数也不起作用。
就目前而言,您最好的选择可能是在第一线let中处理您的路由参数。或者,您可以使用设计为应用于不同符号的解析器工厂来处理默认路由参数:
;; ATTN: :io.aviso.rook.dispatcher/route-params is an implementation detail
;; NB. this assumes it will be registered under the keyword :route-param
(fn [sym]
(fn [request]
(let [route-param-kw (:route-param (meta sym))]
(assert (keyword? route-param-kw))
(-> request :io.aviso.rook.dispatcher/route-params route-param-kw))))你会像这样使用它:
(defn show [^{:route-param :id} foo]
…)这只是获取路径片段的原始运行时值,但可以直接修改它以应用任意转换(如果需要灵活性,可以从参数符号上的元数据中提取函数)。请注意,如果输入不符合预期,则需要确保参数解析器不会抛出。
https://stackoverflow.com/questions/35068222
复制相似问题