首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Rook中创建参数解析器

如何在Rook中创建参数解析器
EN

Stack Overflow用户
提问于 2016-01-28 17:36:44
回答 1查看 52关注 0票数 1

我想在Rook中创建一个参数解析器,它可以对输入进行简单的转换。假设我有一个像/resource/1这样的简单REST URL来获得id 1的资源。但是id以"1"的形式出现,即字符串。我不想在每个端点函数中显式地将id转换为字符串。

我似乎可以用参数解析器来完成这个任务,例如,我尝试了这样的方法:

代码语言:javascript
复制
(def handler (-> (rook/namespace-handler
                  ["resource" 'my-project.resource {'id #(Integer. %)}])
                 rook/wrap-with-standard-middleware))

然后,在资源命名空间中,我已经将id作为整数。

代码语言:javascript
复制
(defn show [id]
  ; id should now be an integer
  (r/response (* id 2)))

但是这不起作用,id仍然是一个字符串,解析器永远不会被调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-28 18:14:53

这里有两个问题:(1)参数解析器是请求的函数;(2)路由params接收特殊的处理,而这些处理目前比其他适用的解析器更优先。

(1)表示争论解决程序必须最终采用以下形式:

代码语言:javascript
复制
(fn [request]
  …)

-例如,您可以编写一个解析器来解析路由param id --就像这样:

代码语言:javascript
复制
(fn [request]
  (-> request :io.aviso.rook.dispatcher/route-params :id Integer/parseInt))

参数解析器工厂采用以下形式

代码语言:javascript
复制
(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中处理您的路由参数。或者,您可以使用设计为应用于不同符号的解析器工厂来处理默认路由参数:

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

你会像这样使用它:

代码语言:javascript
复制
(defn show [^{:route-param :id} foo]
  …)

这只是获取路径片段的原始运行时值,但可以直接修改它以应用任意转换(如果需要灵活性,可以从参数符号上的元数据中提取函数)。请注意,如果输入不符合预期,则需要确保参数解析器不会抛出。

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

https://stackoverflow.com/questions/35068222

复制
相关文章

相似问题

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