Swagger文档管理

2022/10/30 Swagger

Swagger文档管理

swagger是一个流行的API开发框架,这个框架以“开放API声明”(OpenAPI Specification,OAS)为基础,对整个API的开发周期都提供了相应的解决方案,是一个非常庞大的项目(包括设计、编码和测试,几乎支持所有语言)。

OpenAPI规范

OpenAPI规范(OAS)为HTTP API定义了一个与语言无关的标准接口,使得人和计算机都可以在不使用源代码、文档或监听网络通信的情况下,具备发现和理解服务的能力。正确定义后,使用者可以使用最少的实现逻辑来理解远程服务并与之交互。

文档生成工具可以使用OpenAPI定义来显示API,代码生成工具可以生成各种编程语言的服务器和客户端代码,测试工具以及许多其他工具也可以使用OpenAPI定义。

Swagger简介

OAS本身是一个API规范,它用于描述一整套API接口,包括一个接口是GET还是POST请求啊,有哪些参数哪些header啊,都会被包括在这个文件中。它在设计的时候通常是YAML格式,这种格式书写起来比较方便,而在网络中传输时又会以json形式居多,因为json的通用性比较强。

由于Spring的流行,Marty Pitt编写了一个基于Spring的组件swagger- springmvc,用于将swagger集成到springmvc中来。而springfox则是从这个组件发展而来,同时springfox也是一个新的项目,本文仍然是使用其中的一个组件springfox- swagger2。

pringfox- swagger2依然是依赖OSA规范文档,也就是一个描述API的json文件,而这个组件的功能就是帮助我们自动生成这个json文件,我们会用到的另外一个组件springfox- swagger-ui就是将这个json文件解析出来,用一种更友好的方式呈现出来。

Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。

从上述 Swagger 定义我们不难看出 Swagger 有以下 3 个重要的作用:

  • 将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档;
  • 当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题;
  • 通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本。

Swagger3完全遵循了 OpenAPI 规范。

Swagger和SpringFox有啥关系?

Swagger 可以看作是一个遵循了 OpenAPI 规范的一项技术,而 springfox 则是这项技术的具体实现。 就好比 Spring 中的 IOC 和 DI 的关系 一样,前者是思想,而后者是实现。

什么是Knife4J? 和Swagger什么关系?

本质是Swagger的增强解决方案,前身只是一个SwaggerUI(swagger-bootstrap-ui)

Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!

Knife4j的前身是swagger-bootstrap-ui,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采用的是后端Java代码+前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j

更名后主要专注的方面

  • 前后端Java代码以及前端Ui模块进行分离,在微服务架构下使用更加灵活
  • 提供专注于Swagger的增强解决方案,不同于只是改善增强前端Ui部分

项目实战

Maven项目依赖

<dependency>  
    <groupId>io.springfox</groupId>  
    <artifactId>springfox-boot-starter</artifactId>  
    <version>3.0.0</version>  
</dependency>  

Swagger注解

Swagger通过注解的方式对接口进行描述,以下是一些常用生成接口文档的注解。

@Api

@Api用在类上,说明该类的作用。可以标记一个Controller类作为Swagger文档资源 tags:接口说明,可以在页面中显示。可以配置多个,当配置多个的时候,在页面中会显示多个接口的信息。

@Api(tags={"用户接口"})
@RestController
public class UserController {

}

@ApiModel

@ApiModel用在类上,表示对类进行说明,用于实体类中的参数接收说明。

@ApiModel(value = "com.param.AddUserParam", description = "新增用户参数") 
public class AddUserParam {
}

@ApiModelProperty

@ApiModelProperty()用于字段,表示对model属性的说明。

@Data
@ApiModel(value = "com.param.AddUserParam", description = "新增用户参数") 
public class AddUserParam {

    @ApiModelProperty(value="ID")
    private String id;

    @ApiModelProperty(value="名称")
    private String name;

    @ApiModelProperty(value="年龄")
    private int age;

}

ApiParam

@ApiParam用于Controller中方法的参数说明。

  • value:参数说明
  • required:是否必填
    @PostMapping("/user")
    public UserDto addUser(@ApiParam(value = " 新增用户参数 ", required = true) @RequestBody AddUserParam param) {
      System.err.println(param.getName());
      return new UserDto();
    }
    

ApiOperation

@ApiOperation用在Controller里的方法上,说明方法的作用,每一个接口的定义。

  • value:接口名称
  • notes:详细说明 ```java @ApiOperation(value = “新增用户”, notes=”详细描述”)

public UserDto addUser(@ApiParam(value = “ 新增用户参数 “, required = true) @RequestBody AddUserParam param) {

}


### ApiResponse和ApiResponses
@ApiResponse用于方法上,说明接口响应的一些信息;
@ApiResponses组装了多个@ApiResponse。
```java
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserDto.class) })
@PostMapping("/user")
public UserDto addUser(@ApiParam(value = " 新增用户参数 ", required = true) @RequestBody AddUserParam param) {

}

ApiImplicitParam和ApiImplicitParams

用于方法上,为单独的请求参数进行说明。

  • name:参数名,对应方法中单独的参数名称。
  • value:参数中文说明。
  • required:是否必填。
  • paramType:参数类型,取值为path、query、body、header、form。
  • dataType:参数数据类型。
  • defaultValue:默认值。
    @ApiImplicitParams({
    @ApiImplicitParam(name="id",value="用户ID",dataType="string", paramType = "query", required=true, defaultValue="1")
      })
    @ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserDto.class) })
    @GetMapping("/user")
    public UserDto getUser(@RequestParam("id")String id) {
    return new UserDto();
    }
    

Search

    微信好友

    博士的沙漏

    Table of Contents