如何避免为每个API路由重复指定produces()和consumes()?
如何避免为每个API路由重复指定Produces/Consumes MIME类型?
我的API大部分接口的Produces和Consumes类型都是application/vnd格式的MIME类型,只有少数端点需要处理不同的MIME类型。不想每次定义路由都重复写produces()和consumes()方法,有没有简洁的实现方式?
原写法(冗余重复)
router.route("/user-roles/:email") .produces(VENDOR_MIME) .consumes(VENDOR_MIME) .method(PUT).handler(userRolesCrudHandler::replace); router.route("/user-roles/:email") .produces(VENDOR_MIME) .method(GET).handler(userRolesCrudHandler::read); router.route("/user-roles/:email") .produces(VENDOR_MIME) .method(DELETE).handler(userRolesCrudHandler::delete); router.route("/user-roles/:email") .produces("text/plain") .method(GET).handler(userRolesCrudHandler::readAsText);
期望写法(简洁统一)
router.defaultProduces(VENDOR_MIME) .defaultConsumes(VENDOR_MIME); router.route("/user-roles/:email") .method(PUT).handler(userRolesCrudHandler::replace); router.route("/user-roles/:email") .method(GET).handler(userRolesCrudHandler::read); router.route("/user-roles/:email") .method(DELETE).handler(userRolesCrudHandler::delete); router.route("/user-roles/:email") .produces("text/plain") .method(GET).handler(userRolesCrudHandler::readAsText);
可行解决方案
1. 利用路由构建器的全局默认配置(优先推荐)
绝大多数现代API框架(比如Vert.x、Spring WebFlux)的路由构建器都支持全局设置默认的Produces/Consumes。直接在Router实例上配置默认值,后续所有未单独指定的路由都会自动继承这些配置,需要特殊MIME类型的路由单独覆盖即可,完全符合你的期望写法。
2. 封装自定义模板方法
如果你的框架不支持全局默认配置,可以自己封装一个工具方法,提前把默认的Produces/Consumes配置好,每次创建路由时直接调用这个方法,减少重复代码:
// 封装工具方法 private Route createDefaultRoute(Router router, String path) { return router.route(path) .produces(VENDOR_MIME) .consumes(VENDOR_MIME); } // 使用示例 createDefaultRoute(router, "/user-roles/:email") .method(PUT).handler(userRolesCrudHandler::replace); createDefaultRoute(router, "/user-roles/:email") .method(GET).handler(userRolesCrudHandler::read); // 特殊路由单独处理 router.route("/user-roles/:email") .produces("text/plain") .method(GET).handler(userRolesCrudHandler::readAsText);
3. 路由分组批量配置
如果你的API有统一前缀的路由集合,可以创建子Router并为整个分组设置默认配置,再挂载到主Router上,适合批量管理同类型路由:
// 创建子路由并设置默认配置 Router userRolesSubRouter = Router.router(vertx); userRolesSubRouter.defaultProduces(VENDOR_MIME) .defaultConsumes(VENDOR_MIME); // 子路由内定义接口 userRolesSubRouter.route("/:email") .method(PUT).handler(userRolesCrudHandler::replace); userRolesSubRouter.route("/:email") .method(GET).handler(userRolesCrudHandler::read); // 挂载子路由到主路由 router.mountSubRouter("/user-roles", userRolesSubRouter); // 特殊路由直接在主路由定义 router.route("/user-roles/:email") .produces("text/plain") .method(GET).handler(userRolesCrudHandler::readAsText);
内容的提问来源于stack exchange,提问作者Jakub Bochenski
相关产品推荐
相关产品推荐

