BudWk V7 从零开始搭建微服务开发框架 - 06 接口文档生成组件

原创
2021/05/31 14:32
阅读数 704

wk-starter-openapi

组件说明

前后端分离的开发模式,REST APIs 需要在线查看接口文档及调试API,比如使用Postman等,那么Java后台就需要一种生成API接口文档的工具或方式,研究市面上的一些文档生成方式,要么较为复杂、要么非V7 的nutz 技术体系,于是构想自己独立实现一套注解,来实现API 文档的生成和在线调试功能。

在开发 Swagger V3(OpenAPI) 标准文档格式生成的同时,突然想到复用这套注解,扩展几个属性,就可以实现后台表单验证功能,好像发现了新大陆,一套注解,可以解决两个比较常用且重要的功能,想法不错,能不能实现呢?

注解定义

OpenAPI 一套注解我是定义在 wk-starter-common里的,主要考虑其是公共的可复用的:

  • @ApiDefinition 控制类注解,定义被解析的控制类,以及接口标签名
  • @ApiOperation Http请求方法注解,需配合 @GET @POST @DELETE 注解使用
  • @ApiFormParams 表单对象注解,定义form参数的字段名称、实体类等
  • @ApiImplicitParams 请求参数注解,定义 Query/Path/Cookies 等参数
  • @ApiResponses 响应对象注解,自动拼接为 Result.data,定义响应结果
  • @ApiModel 实体类注解,定义被解析的实体类

其中,

  • @ApiFormParam 表单参数注解
  • @ApiImplicitParam 查询参数注解
  • @ApiModelProperty 实体类属性注解

他们有几个公共的属性字段,如 required=是否必填、example=文档调试示例值、df=默认值、check=是否进行值验证、validation=值验证正则、regex=自定义正则、msg=值验证失败提示文字 等,较为容易理解。

解析并生成文档

NutzReader 这个类是关键,读取注解并进行解析,然后组装成 OpenAPI 文档格式,主要参考如下资源:

解析后,利用 HttpServlet 生成Json或Yaml格式数据输出即可:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final String pathInfo = req.getRequestURI();
        if (pathInfo.endsWith("/openapi.json") || pathInfo.endsWith("/openapi.yaml")) {
            OpenAPI oas = (OpenAPI) req.getServletContext().getAttribute("openapi");
            String type = "json";
            String acceptHeader = req.getHeader("Accept");
            if (Strings.isNotBlank(acceptHeader) && acceptHeader.toLowerCase().contains("application/yaml")) {
                type = "yaml";
            } else if (req.getRequestURL().toString().toLowerCase().endsWith("yaml")) {
                type = "yaml";
            }

            resp.setStatus(200);
            PrintWriter pw;
            if (type.equalsIgnoreCase("yaml")) {
                resp.setContentType("application/yaml");
                pw = resp.getWriter();
                pw.write(io.swagger.v3.core.util.Yaml.pretty(oas));
                pw.close();
            } else {
                resp.setContentType("application/json");
                pw = resp.getWriter();
                pw.write(io.swagger.v3.core.util.Json.pretty(oas));
                pw.close();
            }

        } else {
            resp.setStatus(404);
        }
    }

预览与在线调试

API文档查看器源码在我另外一个开源项目里 budwk-openapi-viewer ,不再赘述,主要是对Json数据对解析和展示。

那么最终效果如何呢,可以点击 这里 查看,或登录 https://demo.budwk.com 查看。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部