自动将 compojure 路由的 id 类型转换为整数
Typecast compojure route's id to integer automatically
我有这样的东西(GET "/photo/:id/tags/:tag-id/...")
因此,对于该上下文中的每条路由,我都必须将这些 id 显式转换为 Integer。有什么方法可以自动实现这一点,或者有一个共同的地方来转换 id 而不是每个控制器的动作?
使用 compojure-api where you can specify schema types for the URL/query params as well as request body. For example 可能会出现此行为:
(defapi app
(GET "/photo/:id" []
:path-params [id :- Long]
(ok {:message (str "Photo with ID " id)})))
通过指定 [id :- Long]
,您要求将 id
路径参数强制转换为 Long
类型。
从 Compojure 1.4.0 开始,您还可以使用 :<< 关键字为参数提供强制函数:
[x :<< as-int]
在上面的例子中,参数x在被赋值之前会通过as-int函数传递。如果任何强制函数returns nil,则认为强制失败,路由将不匹配。
示例:
(defroutes app
(GET "/customers" [] customers)
(GET "/suppliers" [] suppliers)
(GET "/accounts" [] accounts)
(context "/statements" []
(GET "/" [] statements)
(GET "/:id" [id :<< as-int] (single-statement id))))
我有这样的东西(GET "/photo/:id/tags/:tag-id/...")
因此,对于该上下文中的每条路由,我都必须将这些 id 显式转换为 Integer。有什么方法可以自动实现这一点,或者有一个共同的地方来转换 id 而不是每个控制器的动作?
使用 compojure-api where you can specify schema types for the URL/query params as well as request body. For example 可能会出现此行为:
(defapi app
(GET "/photo/:id" []
:path-params [id :- Long]
(ok {:message (str "Photo with ID " id)})))
通过指定 [id :- Long]
,您要求将 id
路径参数强制转换为 Long
类型。
从 Compojure 1.4.0 开始,您还可以使用 :<< 关键字为参数提供强制函数:
[x :<< as-int]
在上面的例子中,参数x在被赋值之前会通过as-int函数传递。如果任何强制函数returns nil,则认为强制失败,路由将不匹配。
示例:
(defroutes app
(GET "/customers" [] customers)
(GET "/suppliers" [] suppliers)
(GET "/accounts" [] accounts)
(context "/statements" []
(GET "/" [] statements)
(GET "/:id" [id :<< as-int] (single-statement id))))