Typecast compojure route的id自动为整数

时间:2016-02-23 07:17:20

标签: clojure routes parseint compojure ring

我有类似(GET "/photo/:id/tags/:tag-id/...")

的内容

因此对于该上下文中的每个路由,我必须明确地将这些id类型转换为Integer。有没有办法自动实现这一点,或者有一个共同的位置来代替每个控制器的行为?

2 个答案:

答案 0 :(得分:3)

您可能会使用compojure-api获取此行为,您可以在其中指定URL /查询参数以及请求正文的架构类型。 For example

(defapi app
  (GET "/photo/:id" []
    :path-params [id :- Long]
    (ok {:message (str "Photo with ID " id)})))

通过指定[id :- Long],您要求将id路径参数强制转换为Long类型。

答案 1 :(得分:2)

从Compojure 1.4.0开始,您还可以使用以下命令为参数提供强制函数:<<关键字:

[x :<< as-int]

在上面的例子中,参数x将在分配之前通过as-int函数传递。如果任何强制函数返回nil,则认为强制失败,并且路由不匹配。

示例:

(defroutes app 
  (GET "/customers" [] customers)
  (GET "/suppliers" [] suppliers)
  (GET "/accounts" [] accounts)
  (context "/statements" []
           (GET "/" [] statements)
           (GET "/:id" [id :<< as-int] (single-statement id))))