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

文章介绍了如何通过Swagger来同步Yapi接口文档,强调了在接口定义中使用Swagger进行标准化的重要性。Swagger配置包括添加依赖、定义配置、接口分类和项目信息。同时,文章提到了实体类和接口注解的规范,以及避免使用Map和Object作为参数类型以提高文档清晰度和联调效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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。

<think>好的,用户需要了解API接口文档的编写、使用和示例。首先,我要确定用户的具体需求是什么。可能他们是一个开发者,正在开发后端接口,或者需要与后端团队协作,所以需要了解如何规范地编写接口文档。用户提到了“如何编写、生成、使用或示例”,所以需要覆盖这些方面。 首先,编写API接口文档的基本要素有哪些?通常包括接口名称、请求方式、URL、请求参数、响应参数、示例和状态码等。我需要整理这些内容,并参考已有的引用资料。例如,引用[1]提到了后端接口的设计规范,引用[3]给出了返回示例和状态码说明,这些都可以用来支撑回答的结构。 接下来,生成API接口文档的方法。用户可能想知道有哪些工具,比如Swagger、Postman、YAPI等。需要简要介绍每个工具的特点,并说明自动生成的优点,比如减少手动维护成本。同时,可以提到引用[1]中提到的设计规范,如何结合工具使用。 然后是使用API接口文档的注意事项。需要强调文档的维护和版本管理,以及测试的重要性。引用[2]中的序列图示例展示了接口调用的流程,可以举例说明如何通过文档理解调用步骤。此外,状态码和错误处理也是关键点,引用[3]中的返回示例可以说明如何设计清晰的响应结构。 在示例部分,应该给出一个具体的例子,比如用户登录接口,展示请求和响应的格式,包括参数、方法、URL等。这样用户能更直观地理解文档的结构。同时,状态码说明也很重要,比如code:100表示成功,code:200表示参数错误,这样前端可以根据不同的code进行处理。 用户可能还有疑问,比如如何保证文档的实时性,或者如何高效协作。这时候需要提到文档工具和版本控制,比如使用Swagger结合Git来管理文档变更。另外,自动化测试工具如Postman可以确保接口按文档实现。 最后,生成相关问题需要考虑用户可能进一步的需求,比如最佳实践、生成工具比较、维护方法等。这些问题可以帮助用户深入学习和解决实际开发中的问题。 总结来说,需要将内容分成几个部分:编写要素、生成方法、使用注意事项、示例和相关问题。每个部分都要结合引用资料中的信息,确保回答的准确性和实用性。同时,语言要简洁明了,符合中文表达习惯,避免使用复杂术语,让不同层次的开发者都能理解。</think>### API接口文档编写、使用与示例详解 #### 一、API接口文档编写规范 1. **基础要素** - **接口名称**:明确功能,例如`用户登录接口` - **请求方式**:GET/POST/PUT/DELETE - **URL路径**:如 `/api/v1/user/login` - **请求参数**:包括参数名、类型、是否必填、说明,例如: $$ \text{username: string, 必填, 用户名} $$ - **响应参数**:定义返回字段结构,如状态码、数据体、错误信息[^3] 2. **结构化要求** - 使用标准模板(如OpenAPI Specification) - 包含接口版本、请求头、鉴权方式(如Token) - 错误码统一说明,例如: $$ \text{code: 200, message: "参数错误"} $$ 3. **示例与可读性** - 提供完整的**请求/响应示例**(JSON格式) - 使用Markdown表格描述参数,例如: | 参数名 | 类型 | 说明 | |--------|--------|--------------| | token | string | 身份验证令牌 | #### 二、API文档生成方法 1. **工具推荐** - **Swagger/OpenAPI**:通过代码注释自动生成文档[^1] - **Postman**:支持接口测试与文档同步发布 - **YAPI**:中文开源接口管理平台 2. **自动生成流程** ```python # Flask示例(使用flasgger生成Swagger文档) from flasgger import Swagger app = Flask(__name__) Swagger(app) ``` > 代码注释规范直接影响文档生成质量[^1] #### 三、API文档使用指南 1. **开发者使用步骤** - 查看鉴权方式(如OAuth2.0) - 根据请求示例构造参数 - 解析响应状态码处理异常 2. **调试技巧** - 使用Postman导入文档并测试 - 关注响应头信息(如`X-RateLimit-Limit`) #### 四、完整接口文档示例 **接口名称**:用户信息查询 **请求方式**:GET **URL**:`/api/v1/user/info` **请求参数**: ```json { "user_id": "string" } ``` **响应示例**: ```json { "code": 100, "data": { "username": "test_user", "email": "user@example.com" }, "message": "请求成功" } ``` **状态码说明**: | Code | 含义 | |------|------------| | 100 | 成功 | | 201 | 无权限访问 |[^3] #### 五、关键注意事项 1. **版本控制**:URL中需包含版本号(如`/v1/`) 2. **安全性**:明确HTTPS要求与敏感数据加密方式 3. **更新维护**:文档变更需通过邮件/公告通知调用方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值