swagger接口文档同步yapi定义标准


title: swagger接口文档同步yapi定义标准
date: 2021-08-07 13:18:29
tags:

  • 接口文档
  • swagger
  • yapi
    categories:
  • [接口文档,swagger,yapi]

前提

在与前端约定yapi接口后,后端可能会与前端私下沟通修改接口方案或者业务调整未同步至yapi,导致经常性会出现实际开发接口与yapi维护的接口不统一的情况。滞后的接口文档,给后续介入开发的人员会造成很大的困惑,这也是这块未统一规范的体现。所以文章旨在通过一种定义标准(选型:swagger),通过实际开发中的代码生成yapi接口文档。一般情况下,联调接口会先于开发定义出来,所以需要定义两套文档,一套用于与前端或业务系统联调,另一套生成用于业务系统实际的开发接口。

swagger使用

配置swagger

以Swagger2为例,添加jar包

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

定义配置SwaggerConfig

@Configuration
@EnableSwagger2
public class SwaggerConfig {
}

输入ip:port/swagger-ui.html,默认swagger页面的结构

image.png

接口分类信息:例如可以区分定义外部接口和内部接口,用Swagger Docket实例的groupName分组显示

项目基本信息:通过Swagger Docket实例的apiInfo方法描述

接口列表:Swagger Docket实例中指定过滤条件后,Controller层所有接口的展示与调用

定义Docket实例

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket docker(){
        // 构造函数传入初始化规范,这是swagger2规范
        return new Docket(DocumentationType.SWAGGER_2)
                //apiInfo: 添加api详情信息,参数为ApiInfo类型的参数,这个参数包含了项目基本信息的必要条件
                .apiInfo(apiInfo())
                //groupName 指定接口的分组信息
                .groupName("groupTest")
                //配置是否启用Swagger,如果是false,在浏览器将无法访问。生产环境需要置为false
                .enable(true)
                .select()
                //apis: 添加过滤条件,
                //.apis(RequestHandlerSelectors.basePackage("com.swagger.demo"))
                //paths: 这里是控制哪些路径的api会被显示出来,比如下方的参数就是除了/test以外的其它路径都会生成api文档
                //.paths((String test) -> !a.equals("/test"))
                .build();
    }

    private ApiInfo apiInfo(){
        Contact contact = new Contact("项目名称:name", "项目连接地址:http://xxx.xxx.com/", "联系人邮箱:XXX");
        return new ApiInfo(
                "标题内容",
                "描述内容",
                "版本内容:v1.0",
                "链接:http://terms.service.url/",
                contact,
                "许可",
                "许可链接",
                // 扩展信息
                new ArrayList<>()
        );
    }
}

实体类定义

@ApiModel 用于swagger标记实体类

属性类型默认值描述
valueString类名类的备用名称
descriptionString“”类的详细描述
parentClass<?>Void.class提供父类以允许描述继承关系
discriminatorString“”支持模型继承和多态,使用鉴别器的字段的名称,可以断言需要使用哪个子类型
subTypesClass<?>[]{}继承该类的子类型数组
referenceString“”指定对应类型定义的引用,覆盖指定的任何其他元数据

@ApiModelProperty用于swagger标记实体类属性

属性描述
value简洁的介绍字段描述
name如果设置这个字段,会覆盖原本属性的名字
allowableValues标明字段的取值范围,例如range[1, infinity] 就是大于等于1
access允许从API文档中过滤属性,参见 io.swagger.core.filter.SwaggerSpecFilter
notes应该是预留字段,未被使用
dataType参数的数据类型
required表示的是当前字段是否是必须的,默认是false
position属性在文档中的位置排序
hidden表示的是是否隐藏当前字段,默认是false
example样例说明
readOnly过时,用accessMode代替
accessMode一个枚举AccessMode的值,其中包括AUTOREAD_ONLYREAD_WRITE
reference指定了属性的类型引用,如果设置了当前属性,会覆盖任何其他的元数据(不常使用)
allowEmptyValue是否允许该字段为空,默认是false
extensions该属性用于进行额外的描述。是一个可选项的数组组成

样例说明

@Data
@ApiModel(description = "用户信息")
public class InfoVO {

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

    @ApiModelProperty(value = "价格",example = "1.0")
    private BigDecimal price;

    @ApiModelProperty(value = "状态 0-未删除 1-逻辑删除",allowableValues = "0,1",example = "0")
    private String status;

    @ApiModelProperty(value = "时间",allowEmptyValue = true)
    private LocalDateTime localDateTime;

}

接口定义

@Api 注解用于标注类为swagger资源

属性描述
value无实义,官网推荐用tags替代
tagstags标签用于将我们的请求分类
description弃用
basePath弃用
position弃用
produces指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回,例如:application/json
consumes指定处理请求的提交内容类型(Content-Type),例如application/json
protocols标识的是当前的请求支持的协议,例如:httphttpswswss
authorizations高级特性认证时配置
hidden配置为true将在文档中隐藏。隐藏整个Controller资源。作用与@ApiIgnore类似,但是没有@ApiIgnore功能强大

@ApiOperation注解一般用于方法上,用作一个HTTP请求的方法描述

属性描述
value表示的是这个方法的一个总结性的描述
notes标识的是对于一个方法的具体性的描述
tags和@Api的tags功能类似
response这个属性设置的是当前请求的返回值类型
responseContainer说明的是包装相应的容器。默认情况下,有效值为 ListSetMap,任何其它值都将被忽略
responseReference这里设置的是一个相应类型的引用。这个引用可以是本地的,也可以是远程的。如果设置了这个值,将会覆盖response属性的值
httpMethod请求方式,例如GETHEADPOSTPUTDELETEOPTIONS
position弃用
nickname这个字段对应的是operationId字段。第三方工具使用operationId来唯一表示此操作.在Swagger2.0之后的版本中,这个字段是不在强制的,如果没有,则系统默认为空
produces指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回,例如:application/json
consumes指定处理请求的提交内容类型(Content-Type),例如application/json
protocols标识的是当前的请求支持的协议,例如:httphttpswswss
authorizations高级特性认证时配置
hidden配置为true将在文档中隐藏。隐藏整个Controller资源。作用与@ApiIgnore类似,但是没有@ApiIgnore功能强大
responseHeaders指定responseheader的信息列表
codehttp返回状态码
extensions可选的扩展数组,举例:extensions = @Extension(properties ={@ExtensionProperty(name = "author", value = "test@xx.com")})
ignoreJsonView忽略JsonView注解,主要的目的是为了做到向下兼容

样例说明

@Api(tags = "swaggger测试")
@RestController
public class TestController {

    @ApiOperation(value = "总结性描述测试1")
    @PostMapping("/test1")
    public APIResult<String> test1(InfoVO infoVO){
        //TODO save operation
        ...
        return APIResult.ofSuccess("数据保存成功");
    }
}

swagger页面显示结果

image.png

基于swagger同步yapi规范

因为swaggger对代码的浸入性很强,所以我们尽可能的定义yapi中所需要的接口信息,摒去无用的定义。

实体类定义

非代码生成器生成的与数据库表结构相关联的domain类,例如与前端交互的VO类、与外部服务进行数据交换的DTO类,需在类头加上@ApiModel注解,在类属性加上@ApiModelProperty注解,便于补全接口文档的同时又可替换类注释。

@ApiModel注解

@apiModel主要用于标记实体类,定义格式:

@ApiModel(description = "xxx") 
public class XXX
属性必填项描述
description定义为类的详细描述

该属性定义后,接口返回类型为Object时,yapi中会显示对象的备注

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugOBaC7J-1673502457803)(null)]

@ApiModelProperty注解

@ApiModelProperty用于标记swagger实体类属性,定义格式:

@ApiModelProperty(value = "xxx",required = true)
private String xxx;
属性必填项描述
value定义为字段的详细描述
required如果字段为必填项,则需要定义required = true 默认为false

定义该属性用于展示在yapi接口中请求参数、返回参数的字段备注、是否必须项信息

1628059935(1).png

接口定义

@Api注解

@Api用于标注类为swagger资源,定义格式:

@Api(tags = "XXX")
@RestController
public class XXXController
属性必填项描述
tags将接口请求分类

定义tags属性,主要用于维护yapi中的文档分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3sOgv8Uv-1673502457709)(null)]

@ApiOperation注解

@ApiOperation用作一个HTTP请求的方法描述,定义格式:

@ApiOperation(value = "xxx")
@PostMapping("/xxx")
public APIResult<String> xxx(){}
属性必填项描述
value一个方法总结性的描述

定义ApiOperation的value属性,主要用于维护yapi中主分类的接口信息

1628061351.png

@ApiImplicitParams和@ApiImplicitParam

@ApiImplicitParams和@ApiImplicitParam组合使用作用于方法上,这里主要用于定义yapi中请求参数的header属性。如非必须尽量不要使用,代码侵入性太严重了。

定义格式:

@ApiImplicitParams({
      @ApiImplicitParam(paramType = "header", name = "xxx", value = "xxx", dataType = "xxx", required = true),
      ...
})
属性必填项描述
paramType定义为header,这里只用作生成yapi中入参的header属性
name参数名称
value参数的具体含义,用作生成yapi中的备注信息
dataType参数的数据类型
required如果字段为必填项,则需要定义required = true 默认为false

yapi中显示结果以及定义方式:

1628064186.png

注意事项

例如以下的几个接口,均不符合标准

//第一种情况 入参为JsonStr  出参为Map
@ApiOperation(value = "错误示范1")
@PostMapping("/errTest1")
public Map<String,Object> errTest1(@RequestBody String infoVo){
    //TODO save operation
    ...
    Map<String,Object> res = new HashMap<>();
    res.put("msg","ok");
    res.put("code",200);
    res.put("data","1");
    return res;
}




//第二种情况 使用javabean传参、出参,但javabean中包含Map、Object的情况
@Data
@ApiModel(description = "test4")
public class Test4 {
    @ApiModelProperty(value = "名称",required = true)
    private String name;
    
    //object属性 swagger不能识别
    @ApiModelProperty(value = "值")
    private Object value;
    
    //尽可能将map、object定义成新的javaBean
    @ApiModelProperty(value = "用户信息")
    private InfoVO infoVo;
} 

@ApiOperation(value = "错误示范2")
@PostMapping("/errTest2")
public APIResult<Test4> errTest2(Test4 test4){
    //TODO save operation
    ...
    return APIResult.ofSuccess(test4);;
}


上方定义的接口生成的swagger文档示例如下
1628062044(1).png
1628062189(1).png

yapi中的接口展示:

1628062695(1).png
1628062819(1).png

错误示例定义出来的接口文档,增大了接口联调的测试难度。接口数据同步到yapi上,因为缺失了必要的字段信息,也会导致接口和代码的可阅读性较差。

所以在实际接口定义过程中,尽量使用javaBean,而不要使用Map、Object、JSON String等方式定义接口的出入参。如果是通用返回结果集,尽量使用泛型替换Object。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你的 API 在运行中,你可以在浏览器中访问 `http://[your-api-domain]/swagger` 来查看 Swagger 接口文档。 例如,如果你的 API 的域名是 `api.example.com`,你可以在浏览器中访问 `http://api.example.com/swagger` 来查看 Swagger 接口文档。 如果你的 API 是本地运行的,你可以在浏览器中访问 `http://localhost:[your-api-port]/swagger` 来查看 Swagger 接口文档。 例如,如果你的 API 端口是 `8000`,你可以在浏览器中访问 `http://localhost:8000/swagger` 来查看 Swagger 接口文档。 注意,这些地址是 Swagger 接口文档的默认地址,如果你或者你的团队更改了 Swagger 接口文档的默认地址,你需要使用新的地址来访问 Swagger 接口文档。 ### 回答2: 如果要找到Swagger接口文档,通常有以下几种方式: 1. 直接请求接口地址:通过浏览器或API测试工具,输入要访问的接口地址,例如:http://localhost:8080/swagger-ui.html,其中localhost是主机名,8080是端口号,swagger-ui.html是Swagger默认的访问页面。如果服务器已经成功部署并配置了Swagger,你应该能够看到相应的接口文档。 2. 在项目源代码中查找:如果你有接口文档的源代码,你可以在项目中搜索Swagger的相关配置文件。通常Swagger的配置文件命名为"springfox.documentation.swagger",你可以在代码仓库中搜索相关关键字来查找Swagger的配置文件。 3. 问询开发人员:如果你是项目的使用者而不是开发者,你可以咨询项目的开发人员以获取Swagger接口文档的访问方式。开发人员通常会提供文档的访问链接或者告诉你项目的部署位置。 总之,通过浏览器访问接口地址、搜索源代码或者问询开发人员是找到Swagger接口文档的常用方法。这些方法可以帮助你快速找到需要的接口文档,进一步了解API的使用方法与参数规格。 ### 回答3: 要找到Swagger接口文档,首先需要确定你要查找的API所在的项目或网站是否使用了Swagger来生成接口文档。 1. 在项目或网站中寻找Swagger的入口:一般情况下,Swagger接口文档的入口URL通常是在项目的根目录下的某个路径,比如/swagger、/api-docs等。你可以在浏览器的地址栏中输入这些路径试试,看看是否能够访问到接口文档。 2. 如果项目没有提供Swagger的入口URL,你可以尝试在项目的代码或配置文件中搜索Swagger相关的关键字,比如@SwaggerSwagger2等。这些关键字通常会在项目的Spring配置文件、Java代码注解、pom.xml文件中出现。找到相应的关键字后,可以尝试在浏览器中输入类似于项目路径/swagger-ui.html的URL来查看接口文档。 3. 如果以上方法都没有找到Swagger接口文档,你可以尝试与项目的开发人员或负责人员联系,询问是否使用了Swagger来生成接口文档。他们可以提供具体的Swagger接口文档的URL或其他相关信息。 总之,要找到Swagger接口文档,需要先确定项目是否使用了Swagger来生成接口文档,然后通过查找项目代码、配置文件或与相关人员交流等方式来获取Swagger接口文档的URL或其他信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值