ToB企服应用市场:ToB评测及商务社交产业平台

标题: SpringBoot3整合SpringDoc实现在线接口文档 [打印本页]

作者: 海哥    时间: 2024-6-17 20:40
标题: SpringBoot3整合SpringDoc实现在线接口文档
写在前面

在现目前项目开辟中,一般都是前后端分离项目。前端小姐姐负责开辟前端,苦逼的我们负责后端开辟
事实是一个人全干,在这过程中编写接口文档就显得尤为紧张了。然而作为一个程序员,最怕的莫过于自己写文档和别人不写文档
各人都不想写文档,那这活就交给今天的主角Swagger来实现了
一、专业名词介绍

①OpenApi是什么?
解答:OpenApi是一个用于描述、定义和共享 RESTful API 文档的规范。最新规范是 OpenAPI 3.0
② Swagger是什么?
解答: Swagger 是一个用于设计和测试 RESTful APIs 的工具。
它提供了API 描述、哀求和相应示例、API 测试和文档生成等丰富的功能。最新版本是Swagger3,支持OpenAPI3.0规范
③ SpringFox  是什么?
SpringFox 是 Spring 社区维护的一个项目(非官方),资助使用者将 Swagger 2 集成到 Spring 中。
目前国内项目使用的都是它
github地址:https://github.com/springfox/springfox
④springDoc是什么?
解答: Spring-doc也是 Spring 社区维护的一个项目(非官方),资助使用者将 Swagger 3 集成到 Spring 中
SpringDoc 支持 Swagger 页面 Oauth2 登录,相较于 SpringFox 而言,它的支撑时间更长,无疑是更好的选择
但是在国内发展较慢,网上一找资料,出来的基本上是 Swagger2的内容。
地址:https://springdoc.org/
⑤ OpenAPI 、Spring-doc和 Swagger 之间的关系
解答:OpenAPI 定义了一种标准的格式来体现 API 文档,而 Swagger 是一个实现 OpenAPI 规范的工具
二、Swagger详细简介

Swagger 江湖人称“丝袜哥”,是一个资助程序员生成接口文档的利器。
只必要简单设置,就可以生成带有漂亮UI界面的接口文档,而且编写的接口代码变了
接口文档随之也跟着变,做到了真正的解放双手。
官网https://swagger.io/
Swagger 优点
三、小试牛刀

说了这么多Swagger 的优点,接下来就小试牛刀,看看怎么将Swagger集成到SpringBoot中。
3.1、环境介绍

注: 仔细的小伙伴可能已经发现了,在springboot3.0之前我用的都是Springfox来集成Swagger管理我们的API接口文档,
但是Springfox已经停止更新了,我们使用的是SpringBoot3 +jdk17 的环境后,Spring官网保举了Springdoc 来整合swagger
3.2 新建一个springboot-web项目

3.3 添加依赖

由于篇幅原因,其他web项目相干依赖这里就不一一贴出来了。
第一个依赖是必须的,而且版本必须大于2.0.0
  1. <dependency>
  2.     <groupId>org.springdoc</groupId>
  3.     <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
  4.     <version>2.2.0</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.springdoc</groupId>
  8.     <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
  9.     <version>2.2.0</version>
  10. </dependency>
复制代码
注:
我们这里使用的是jdk17+springboot3.3.0 环境,原来swagger的V2和V3都不能用了,小伙伴们一定更要注意这儿

如果引入上面错误的依赖,项目启动会报下面错误,这时候我们引入上面正确的依赖重新启动项目即可

3.4 编写HelloController

新建一个controller包--->建立一个HelloController类
  1. @RestController
  2. public class HelloController {
  3.     @RequestMapping("/hello")
  4.     public String hello(){
  5.         return "hello";
  6.     }
  7. }
复制代码
我们在浏览器中输入“http://localhost:8080/hello” 后回车,出现如下界面,说明我们的hello开辟成功了

3.5 访问swagger接口页面

:我们这里采用的是openapi ,所以就不用像swagger的V2和v3那样添加设置类了
浏览器直接输入:http://localhost:8080/swagger-ui/index.html 回车即可看到下面界面

整合swagger是不是很简单呢
四、修改接口


从上面截图中我们看到,我们在HelloController 中只定义了一个接口,但是前端UI界面中出来个7种哀求方式(GET、PUT、POST、DELETE、OPTIONS、HEAD、PATCH)的接口,这是为什么呢?
解答:@RequestMapping("/hello") 我们接口中只是指定了访问地址,并没有指定哀求方式
我们将注解修改成@RequestMapping(path =  "/hello",method = RequestMethod.GET)
或者@GetMapping("/hello") 然后重启服务,我们看到界面上就只有一种哀求方式的接口了

五、接口文档常用设置

5.1 设置访问路径

在application.yml中可以自定义api-docs和swagger-ui的访问路径。当然了,如果没设置,默认就是下面路径
  1. springdoc:
  2.   api-docs:
  3.     path: /v3/api-docs
  4.   swagger-ui:
  5.     path: /swagger-ui.html
复制代码
5.2 设置接口文档基本信息

① 设置接口基本信息
新建一个config包--->并在包下建立一个SpringDocConfig设置类

② 设置接口文档根本信息
我们在设置类中添加如下代码,
  1. @Configuration
  2. public class SpringDocConfig {
  3.     @Bean
  4.     public OpenAPI openAPI() {
  5.         return new OpenAPI()
  6.                 // 配置接口文档基本信息
  7.                 .info(this.getApiInfo())
  8.                 ;
  9.     }
  10.     private Info getApiInfo() {
  11.         return new Info()
  12.                  // 配置文档标题
  13.                 .title("SpringBoot3集成Swagger3")
  14.                 // 配置文档描述
  15.                 .description("SpringBoot3集成Swagger3示例文档")
  16.                 // 配置作者信息
  17.                 .contact(new Contact().name("程序员小凡").url("https://www.xiezhrspace.cn").email("1666397814@163.com"))
  18.                 // 配置License许可证信息
  19.                 .license(new License().name("Apache 2.0").url("https://www.xiezhrspace.cn"))
  20.                 // 概述信息
  21.                 .summary("SpringBoot3集成Swagger3示例文档aaa")
  22.                 .termsOfService("https://www.xiezhrspace.cn")
  23.                 // 配置版本号
  24.                 .version("2.0");
  25.     }
  26. }
复制代码
前端页面访问接口文档页面后显示如下

② 设置接口servers信息
接口可能存在多环境,如开辟环境、测试环境、生产环境等
我们可以通过@OpenAPIDefinition 配合servers 属性来设置不同环境,具体设置示例如下
  1. @OpenAPIDefinition(
  2.         servers = {
  3.                 @Server(description = "开发环境服务器", url = "http://localhost:8080"),
  4.                 @Server(description = "测试环境服务器", url = "https://test.xiezhr.com")
  5.         }
  6. )
  7. @Configuration
  8. public class SpringDocConfig {
  9.     //...
  10. }
复制代码
设置完成后,浏览器访问显示如下

③ 设置外部文档信息
有时候我们必要在在线接口文档中可以显示跳转到API的一些外部文档(好比 项目部署文档等)
这个时候我们可以通过@OpenAPIDefinition 配合  externalDocs 属性来设置外部文档
具体设置如下
  1. @OpenAPIDefinition(
  2.     externalDocs = @ExternalDocumentation(
  3.         description = "项目编译部署说明",
  4.         url = "http://localhost:8080/deplay/readme.md"
  5.     )
  6. )
  7. @Configuration
  8. public class SpringDocConfig {
  9.     //......
  10. }
复制代码
设置完后重启服务,浏览器访问接口文档,显示如下

SpringDocConfig 类完整设置代码如下
  1. @OpenAPIDefinition(
  2.         servers = {
  3.                 @Server(description = "开发环境服务器", url = "http://localhost:8080"),
  4.                 @Server(description = "测试环境服务器", url = "https://test.xiezhr.com")
  5.         },
  6.         externalDocs = @ExternalDocumentation(
  7.                 description = "项目编译部署说明",
  8.                 url = "http://localhost:8080/deplay/readme.md"
  9.         )
  10. )
  11. @Configuration
  12. public class SpringDocConfig {
  13.     @Bean
  14.     public OpenAPI openAPI() {
  15.         return new OpenAPI()
  16.                 // 配置接口文档基本信息
  17.                 .info(this.getApiInfo())
  18.                 ;
  19.     }
  20.     private Info getApiInfo() {
  21.         return new Info()
  22.                  // 配置文档标题
  23.                 .title("SpringBoot3集成Swagger3")
  24.                 // 配置文档描述
  25.                 .description("SpringBoot3集成Swagger3示例文档")
  26.                 // 配置作者信息
  27.                 .contact(new Contact().name("程序员小凡").url("https://www.xiezhrspace.cn").email("1666397814@163.com"))
  28.                 // 配置License许可证信息
  29.                 .license(new License().name("Apache 2.0").url("https://www.xiezhrspace.cn"))
  30.                 //
  31.                 .summary("SpringBoot3集成Swagger3示例文档aaa")
  32.                 .termsOfService("https://www.xiezhrspace.cn")
  33.                 // 配置版本号
  34.                 .version("2.0");
  35.     }
  36.   
  37. }
复制代码
设置完上面信息后,重启服务,浏览器访问:http://localhost:8080/v3/swagger-ui/index.html

5.3  设置扫描接口

应用场景:
有时候我们为了业务必要,我们建立了多个包下的接口,如admin包下的,common包下的接口,
为了安全起见,我们只答应接口文档中访问comm包下面的接口。
在不加任何设置的情况下,所以接口都会默认显示,具体如下

设置扫描接口包:
在application.yml中可以自定义要扫描的接口包
  1. springdoc:
  2.   packages-to-scan: com.xiezhr.swaggerdemo.common.controller
复制代码
设置好之后重启服务,我们发现前台UI只显示了common包下面的接口了

5.4 设置接口文档开关

使用场景:
为了接口安全,我们一般必要在测试(test)环境或者开辟(dev)环境中开启接口文档,而在生产(prod)环境中 关闭接口文档
这个应该怎么做呢?
这里涉及到SpringBoot多环境设置,忘记的小伙伴可以翻一翻之前的文章。传送门:
我们创建三个设置文件,分别为
只需在①和②设置文件中添加如下设置
  1. springdoc:
  2.   api-docs:
  3.     enabled: true
复制代码
而③设置文件中添加
  1. springdoc:
  2.   api-docs:
  3.     enabled: false
复制代码
通过上面设置后,我们在开辟和测试环境下:就能正常访问http://localhost:8080/v3/swagger-ui/index.html#/
而在生产环境下就无法访问,报如下错误

5.5 设置API分组

为了演示API分组,我们在controller包下面再建立admin包和common包,包下分别添加AdminController和CommonController接口类,布局及代码如下

① AdminController类
  1. // AdminController
  2. @RestController
  3. @RequestMapping("/admin")
  4. public class AdminController {
  5.     @GetMapping("/index")
  6.     public String  admin(){
  7.         return "admin";
  8.     }
  9. }
复制代码
② CommonController 类
  1. @RestController
  2. @RequestMapping("/common")
  3. public class CommonController {
  4.    @GetMapping("/hello")
  5.     public String hello(){
  6.         return "hello";
  7.     }
  8. }
复制代码
在默认情况(没有分组)的情况下,全部包下接口都显示在一一个默认组下面,如/common/*   和/admin/* 访问路径下的接口都显示在一起,如下图所示

这时,如果/common/* 下的接口比力多,/admin/* 下的接口也比力多,界面上显示就很混乱
解决办法就是添加分组信息,我们在SpringDocConfig 设置类中添加如下代码,这样就把接口分为了"common通用模块组" 和"admin模块组" 两个组
  1. @Bean("commonGroupApi")
  2. public GroupedOpenApi webGroupApi() {
  3.     return GroupedOpenApi.builder().group("common通用模块组")
  4.         .pathsToMatch("/common/**")
  5.         .build();
  6. }
  7. @Bean("adminGroupApi")
  8. public GroupedOpenApi adminGroupApi() {
  9.     return GroupedOpenApi.builder().group("admin模块组")
  10.         .pathsToMatch("/admin/**")
  11.         .build();
  12. }
复制代码
重启服务,再访问http://localhost:8080/v3/swagger-ui/index.html  如下

5.6 设置接口信息

@Tag 注解使用
对一个 operation 进行说明或定义的标签,用在类或方法上,也可以用在 @OpenAPIDefinition 中定义标签。
常用参数:
示例:
用在类上
  1. @RestController
  2. @RequestMapping("/common")
  3. @Tag(name = "公共接口", description = "公共接口")
  4. public class CommonController {
  5.     //......
  6. }
复制代码
@Operation 注解使用
用于说明方法用途,用在方法上。
参数:
示例:
  1. @GetMapping("/hello")
  2. @Operation(summary = "hello接口", description = "hello接口描述" ,hidden = true)
  3. public String hello(){
  4.     return "hello";
  5. }
复制代码
@Parameter注解使用
用于说明方法参数,用在方法参数上。
参数:
示例:
  1. @GetMapping("/user/{id}")
  2. public User getUser( @Parameter(name = "id",in = ParameterIn.PATH,description = "用户ID",required = true) @PathVariable("id") Integer id){
  3.     User user = userService.getUserById(id);
  4.     return user;
  5. }
复制代码
前端页面查看

@ApiResponse 注解使用
用于说明一个相应信息,用在 @ApiResponses 中。
参数:
示例:
  1. @GetMapping("/user/{id}")
  2. @Operation(summary = "获取用户信息", description = "根据用户ID获取用户信息")
  3. @ApiResponses(value ={
  4.     @ApiResponse(responseCode = "200", description = "请求成功"),
  5.     @ApiResponse(responseCode = "404", description = "用户不存在")            
  6. })
  7. public User getUser( @Parameter(name = "id",in = ParameterIn.PATH,description = "用户ID",required = true) @PathVariable("id") Integer id){
  8.     User user = userService.getUserById(id);
  9.     return user;
  10. }
复制代码

完整设置
  1. @RestController
  2. @RequestMapping("/common")
  3. @Tag(name = "公共接口", description = "公共接口")
  4. public class CommonController {
  5.     @Autowired
  6.     private IUserService userService;
  7.    @GetMapping("/hello")
  8.    @Operation(summary = "hello接口", description = "hello接口描述" ,hidden = true)
  9.     public String hello(){
  10.         return "hello";
  11.     }
  12.     @GetMapping("/hi")
  13.     @Operation(summary = "hi接口", description = "hi接口描述")
  14.     public String Hi(){
  15.         return "Hi 程序员小凡";
  16.     }
  17.     @GetMapping("/user/{id}")
  18.     @Operation(summary = "获取用户信息", description = "根据用户ID获取用户信息")
  19.     @ApiResponses(value ={
  20.             @ApiResponse(responseCode = "200", description = "请求成功"),
  21.             @ApiResponse(responseCode = "404", description = "用户不存在")
  22.     })
  23.     public User getUser( @Parameter(name = "id",in = ParameterIn.PATH,description = "用户ID",required = true) @PathVariable("id") Integer id){
  24.         User user = userService.getUserById(id);
  25.         return user;
  26.     }
  27. }
复制代码
重启后,浏览器访问http://localhost:8080/v3/swagger-ui/index.html 如下

5.7 设置实体信息

① 新建一个User实体类
  1. @Data
  2. public class User {
  3.     private String name;
  4.     private Integer age;
  5.     private String email;
  6.     private String address;
  7. }
复制代码
@Schema标签使用
用于描述数据对象信息或数据对象属性,好比各种POJO类及属性,用在类或类属性上。
参数:
③使用示例:
  1. @Data
  2. @Schema(description = "用户实体类",name = "User")
  3. public class User {
  4.     @Schema(description = "用户名",name =  "name",minLength =  6,maxLength = 20,required = true)
  5.     private String name;
  6.     @Schema(description = "年龄",name =  "age",required = true,minimum = "1",maximum = "100")
  7.     private Integer age;
  8.     @Schema(description = "邮箱",name =  "email",required = true)
  9.     private String email;
  10.     @Schema(description = "地址",name =  "address")
  11.     private String address;
  12. }
复制代码
④ 浏览器访问:http://localhost:8080/v3/swagger-ui/index.html ,我们看到设置的实体信息显示出来了

六、接口调试

通过上面各种设置之后,我们的在线接口文档基本上生成得差不多了。接下来我们就来说说怎么使用在线接口文档进行接口测试
① 测试说明
在之前末节中我们开辟了要给根据用户ID 获取用户信息的接口getUser。我们现在要做的就是在前端UI界面中找到这个接口,
在开辟环境下输入用户ID值,然后获取用户信息。
② 选择组信息
【获取用户信息】这个接口在,common通用模块组下面,所以我们第一步就要前端UI界面右上角选择这个组

② 选择开辟环境
在Servers 下选择设置好的开辟环境

找到我们要测试的接口

④ 测试接口,获取相应数据
接口右边下三角箭头展开接口------>点击Try it out

输入参数:用户ID------> 点击【Execute】----->在Response body 中查看接口相应信息

七、添加哀求头

很多时候我们接口都必要认证之后才气访问,这时候我们就必要接口调用的时候携带着Token信息
示例:
我们通过@RequestHeader  注解 获取哀求头中token信息
  1. @GetMapping("/index")
  2. public String  admin(@RequestHeader ("token") String token){
  3.         System.out.println("token>>>>>>>>>>>>>>>>>>>>>>>>"+token);
  4.     //token 验证
  5.     //.....各种业务逻辑
  6.     return "admin";
  7. }
复制代码

到此,本期内容就结束了,★,°:.☆( ̄▽ ̄)/$:.°★ 。  希望对您有所资助
我们下期再见 ヾ(•ω•`)o (●'◡'●)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4