当前位置: 首页 > Web前端 > HTML

前端开发SpringBoot接口文档的生成

时间:2023-03-27 23:20:03 HTML

相信不管是前端开发还是后端开发,都或多或少被接口文档折磨过。前端经常抱怨后端给的接口文档与实际不符。后端感觉编写和维护接口文档会消耗很多精力,很多时候来不及更新。随着Springboot、Springcloud等微服务的流行,每个前端培训项目都有上百个接口调用。这时候手工编写接口文档,保证文档的实时更新几乎是不可能的,所以这个时候我们就急需一个工具,一个可以帮我们自动生成接口文档,自动更新文档的工具。这是招摇。Swagger提供了一种维护API文档的新方式,它有四大优势:自动生成文档:Swagger只需要少量的注解,就可以根据代码自动生成API文档,保证了文档的时效性。跨语言,支持40多种语言。SwaggerUI呈现的是一个交互式的API文档。我们可以直接在文档页面尝试API调用,无需准备复杂的调用参数。也可以将文档规范导入相关工具(如SoapUI),它会自动为我们创建自动化测试。现在我们知道了Swagger的作用,让我们将它集成到我们的项目中。Swagger集成集成Swagger非常简单,只需要三个简单的步骤。第一步:引入依赖包io.springfoxspringfox-swagger22.9.2io.springfoxspringfox-swagger-ui2.9.2第二步:修改配置文件application.properties,添加控制是否启用Swagger的配置。生产环境记得关闭Swagger,设置值为falsespringfox.swagger2.enabled=true2.添加一个swagger配置类@Configuration@EnableSwagger2@ConditionalOnClass(Docket.class)publicclassSwaggerConfig{privatestaticfinalStringVERSION="1.0";@Value("${springfox.swagger2.enabled}")privateBooleanswaggerEnabled;@BeanpublicDocketcreateRestApi(){returnnewDocket(DocumentationType.SWAGGER_2).enable(swaggerEnabled).groupName("SwaggerDemo")。apiInfo(apiInfo()).select().apis(请求estHandlerSelectors.withClassAnnotation(Api.class)).paths(PathSelectors.any()).build();}/***添加概要信息*/privateApiInfoapiInfo(){returnnewApiInfoBuilder().title("接口文档").contact(newContact("JAVA日知录","http://javadaily.cn","jianzh5@163.com")).description("Swagger接口文档").version(VERSION).build();}}这里通过.apis(RequestHandlerSelectors.withClassAnnotation(Api.class)),标记为@Api注解的类自动生成接口文档第三步配置API接口@RestController@Api(tags="参数验证")@Slf4j@ValidatedpublicclassValidController{@PostMapping("/valid/test1")@ApiOperation("RequestBody验证")publicStringtest1(@Validated@RequestBodyValidVOvalidVO){log.info("validEntityis{}",validVO);return"test1validsuccess";}@ApiOperation("FormValidation")@PostMapping(value="/valid/test2")publicStringtest2(@ValidatedValidVOvalidVO){log.info("validEntityis{}",validVO);return"test2validsuccess";}@ApiOperation("单参数验证")@PostMapping(value="/valid/test3")publicStringtest3(@EmailStringemail){log.info("emailis{}",电子邮件);return"emailvalidsuccess";}}通过@Api注解需要生成接口文件,通过@ApiOperation注解标注接口名称。同时,我们也给ValidVO加上相应的注解@Data@ApiModel(value="参数验证类")publicclassValidVO{@ApiModelProperty("ID")privateStringid;@ApiModelProperty(value="应用ID",example="cloud")privateStringappId;@NotEmpty(message="levelcannotbeempty")@ApiModelProperty(value="level")privateStringlevel;@ApiModelProperty(value="age")privateintage;...}这是@ApiModel标注的参数实体,@ApiModelProperty标注的字段描述。无法推断基本url只需三个步骤即可。我们的项目集成了Swagger接口文档。快速启动服务,访问http://localhost:8080/swagger...即可体验。好吧,出了点问题,但不要惊慌。出现这个问题的原因是我们添加了ResponseBodyAdvice统一处理返回值/响应体,导致对Swagger的返回值进行了一层包裹,无法解析UI页面。可以通过http://localhost:8080/v2/api-....观察Swagger返回的json数据。既然知道了问题的原因,那么解决起来就很简单了。我们只需要在ResponseBodyAdvice处理类中转换自己项目的接口即可。@RestControllerAdvice(basePackages="com.jianzh5.blog")@Slf4jpublicclassResponseAdviceimplementsResponseBodyAdvice{...}通过添加basePackage属性限制统一返回值的范围,这不会影响Swagger。重启服务器,再次访问swagger接口地址,就可以看到接口文档页面了。Forinputstring:""Swagger2.9.2有一个bug,就是当我们的参数实体有int类型的参数时,后台在打开Swagger界面页面时总会提示异常:java.lang.NumberFormatException:Forinputstring:""在java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)在java.base/java.lang.Long.parseLong(Long.java:702)在java.base/java.lang.Long。valueOf(Long.java:1144)有两种解决方法:对int类型字段使用@ApiModelPorperty注解时,加上example属性@ApiModelProperty(value="age",example="10")privateintage;去除原有swagger-models和swagger-annotations中的swagger,自行引入高版本注解和模型io.springfoxspringfox-swagger22.9.2io.swaggerswagger-annotationsio.swagger招摇模型io.swaggerswagger-annotations<版本>1.5.22io.swaggerswagger-models1.5.22虽然在集成Swagger的过程中会出现两个小问题,但是我们会解决它们你就可以愉快的享受Swagger给我们带来的便利了。Swagger美化了Swagger的原生UI,有点难看。我们可以借助Swagger的增强工具knife4j对其进行优化。第一步:引入依赖包com.github.xiaoyminknife4j-spring-boot-starter2.0.4"由于knife4j已经有了swagger-annotations和swagger-models的依赖,我们可以删除上面手动添加的两个依赖。》第二步:启用knife4j增强@Configuration@EnableSwagger2@ConditionalOnClass(Docket.class)@EnableKnife4jpublicclassSwaggerConfig{...}通过以上两步我们就完成了对Swagger的美化,通过访问http://localhost浏览器:8080/doc.html就可以看到效果了,看到这里Swagger参数分组的同学肯定会想,就这样吧?这就是老手做的吗?和我们新手没什么区别!别着急,我们来先看一个效果,首先我们定义了两个接口,一个用于添加,一个用于编辑@ApiOperation("Add")@PostMapping(value="/valid/add")publicStringadd(@Validated(value={ValidGroup.Crud.Create.class})ValidVOvalidVO){log.info("validEntityis{}",validVO);return"test3validsuccess";}@ApiOperation("Update")@PostMapping(value="/valid/update")publicStringupdate(@Validated(value=ValidGroup.Crud.Update.class)ValidVOvalidVO){log.info("validEntityis{}",validVO);return"test4validsuccess";}注意,这里使用的是同一个实体ValidVO来接收前端参数,只是使用了参数验证中的分组,然后我们打开kife4j页面观察界面的区别两人的证件。New:Edit:从上面可以看出,虽然用于接受参数的实体是一样的,但是分组不同时,显示给前端的参数是不一样的。这就是Swagger的分组功能。当然,原来的Swagger是不支持分组功能的,我们需要对Swagger进行扩展。我有代码上传到github,由于代码量较大,这里就不一一展示了,大家可以自行查看。引入扩展类后,需要在Swagger配置类SwaggerConfig中注入相应的Bean。@Configuration@EnableSwagger2@ConditionalOnClass(Docket.class)@EnableKnife4jpublicclassSwaggerConfig{...@Bean@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER+1000)publicGroupOperationModelsProviderPlugingroupOperationModelsProviderPlugin(){返回新的GroupOperationModelsProviderPlugin();}@Bean@Order(Swagger.PluginSupSWAGGER_PLUGIN_ORDER+1000)publicGroupModelBuilderPlugingroupModelBuilderPlugin(){returnnewGroupModelBuilderPlugin();}@Bean@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER+1000)publicGroupModelPropertyBuilderPlugingroupModelPropertyBuilderPlugin(){returnnewGroupModelPropertyBuilderPlugin();}@Bean@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER+1000)publicGroupExpandedParameterBuilderPlugingroupExpandedParameterBuilderPlugin(){returnnewGroupExpandedParameterBuilderPlugin();}@Bean@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER+1000)publicGroupOperationBuilderPlugingroupOperationBuilderPlugin(){returnnewGroupOperationBuilderPlugin();}@Bean@Primary@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER+1000)publicGroupModelAttributeParameterExpandergroupModelAttributeParameterExpander(FieldProviderfields,AccessorsProvideraccessors,EnumTypeDeterminerenumTypeDeterminer){returnnewGroupModelAttributeParameterExpander,Typeenum,accessorDeterminer);}Group使用说明1.在bean对象的属性中配置如下注解@Null(groups=ValidGroup.Crud.Create.class)@NotNull(groups=ValidGroup.Crud.Update.class,message="ApplicationIDcannotbeempty")@ApiModelProperty(value="applicationID",example="cloud")privateStringappId;添加新场景时,appId为空,不需要传值;修改场景时,appId不能为空,需要传值;其他没有配置的组为默认组(Default)2.接口参数时添加组规则验证@ApiOperation("Add")@PostMapping(value="/valid/add")publicStringadd(@Validated(value={ValidGroup.Crud.Create.class})ValidVOvalidVO){log.info("validEntityis{}",validVO);return"test3有效成功";}当前接口会针对默认组的bean属性进行检查,并检查保存公共属性总结Swagger集成相对简单。虽然在集成过程中出现了一些小问题,但都轻松解决了。今天这篇文章的重点是Swagger的分组功能。和之前的参数验证文章一样,很多同学在遇到这种分组场景的时候,往往会选择创建多个实体类。虽然也能解决问题,但总有点别扭。原作者:迷雾果酱