swagger-blocks 高级技巧:6招减少DSL样板代码,让API文档维护效率翻倍
swagger-blocks 高级技巧6招减少DSL样板代码让API文档维护效率翻倍【免费下载链接】swagger-blocksDefine and serve live-updating Swagger JSON for Ruby apps.项目地址: https://gitcode.com/gh_mirrors/sw/swagger-blocksswagger-blocks是一个纯 Ruby 的 API 文档工具它用 DSL 代码块描述接口动态生成 Swagger/OpenAPI 格式的 JSON兼容 Rails、Sinatra 等所有 Ruby 框架并支持改完代码刷新即见新文档的实时更新。入门只需照官方示例写key调用即可跑通。但真实项目里接口动辄几十个重复的参数定义、重复的 404 响应、满屏的样板代码会让文档维护变得痛苦。下面 6 个技巧全部来自项目源码能力能帮你把 DSL 代码量大幅压缩 ⚡技巧 1用内联 keys 一行写完声明每个块block的第一个参数都可以直接传一个哈希替代成堆的key调用。三种写法完全等价# 写法一逐行 key最啰嗦 parameter do key :name, :petId key :in, :path key :required, true key :type, :string end # 写法二块头传内联 keys parameter name: :petId, in: :path do key :description, 要查询的宠物 ID end # 写法三纯内联一行搞定 parameter name: :petId, in: :path, required: true, type: :string底层由 node.rb 中的keys方法把内联哈希合并进节点数据任何块都支持不只是parameter。短小字段全部内联长描述再单独key代码可读性立刻上一个台阶。技巧 2参数一次声明处处复用parameter referencing同一个limit、page查询参数出现在 10 个接口里没必要写 10 遍。在swagger_root中命名声明一次之后直接以符号引用swagger_root do # ... parameter :limit do key :name, :limit key :in, :query key :type, :integer end end swagger_path /pets do operation :get do parameter :limit # 一行引用自动生成 $ref end end原理见 path_node.rb 与 operation_node.rb传入符号时会自动转换为{$ref #/parameters/limit}。改一处全部接口同步生效。技巧 3把公共 401/404 响应抽成模块多数 API 都有统一的未授权资源不存在响应。与其在每个操作里重复声明不如封装成模块用extend一行注入module SwaggerResponses module AuthError def self.extended(base) base.response 401 do key :description, 未授权 end end end end operation :post do extend SwaggerResponses::AuthError # 401 自动带上 response 200 do key :description, 创建成功 end end配合技巧 2你的每个操作块可以只剩下真正独有的声明。技巧 4同一个 swagger_path 跨多次声明自动合并DSL 的合并机制是官方设计同名swagger_path、同名swagger_schema再次声明时会合并进已有的节点而不是报错见 class_methods.rb。这意味着你可以自由拆分职责控制器里声明路径与操作模型类里声明swagger_schema文档控制器里声明swagger_root最后Swagger::Blocks.build_root_json(SWAGGERED_CLASSES)会遍历所有类把分散的节点合并成一份完整 JSON聚合逻辑在 internal_helpers.rb。声明越分散单文件越清爽。技巧 5OpenAPI 3.0 用 swagger_component 集中管理复用件项目同样支持 OpenAPI 3.0node.rb 中openapi: 3.0.0即启用。3.0 规范把可复用内容统一收进components对应 DSL 是swagger_component可收纳schema、parameter、response、requestBody等见 component_node.rbswagger_component do schema :Pet, required: [:id, :name] do property :id do key :type, :integer end property :name do key :type, :string end end response :NotFound do key :description, 资源不存在 end end操作里用key :$ref, :Pet引用即可框架会在生成 JSON 时自动把$ref补全为#/components/schemas/Pet等规范路径你完全不用手写。技巧 6按需生成 JSON还能按环境覆盖文档 JSON 是运行时生成的所以天然适合做环境差异化。build_root_json返回普通哈希可以随意二次加工def build_root_json(overrides {}) Swagger::Blocks.build_root_json(SWAGGERED_CLASSES).merge(overrides) end两个实用场景不同环境展示不同 API根据RAILS_ENV传入不同的 overrides如切换host、增删tag实现生产文档与测试文档自动区分导出静态文件to_json后写入swagger.json交给 CI 或静态托管一行代码即可完成小结 技巧解决的问题内联 keys短字段声明啰嗦参数引用同一参数重复定义响应模块公共 401/404 重复声明跨类声明合并单文件膨胀、职责混乱swagger_componentOpenAPI 3.0 复用件管理build_root_json 覆盖环境差异化与静态导出更多完整示例可参考项目自带的测试文件swagger_v2_blocks_spec.rb 和 swagger_v3_blocks_spec.rb它们覆盖了绝大多数 DSL 特性。安装只需在 Gemfile 中加入gem swagger-blocks把上面 6 招用进去你的 API 文档维护效率会翻倍 【免费下载链接】swagger-blocksDefine and serve live-updating Swagger JSON for Ruby apps.项目地址: https://gitcode.com/gh_mirrors/sw/swagger-blocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考