Swagger开发规范 [推荐]

Springfox Swagger 和Spring的整合已经让我们可以动态的生成接口文档了,但是接口文档的定义需要遵循一定的规范,才能大大提高项目团队间的接口对接效率。


Swagger开发规范 [推荐]

swagger JSON文档生成

maven-surefire-plugin(指定Swagger测试用例)

notes\env\maven\2018-06-27-maven-surefire-plugin.md

虚拟注入和扫描

notes\spring\components\2018-06-08-springfox-swagger-jenknis.md

接口定义规范

  • 接口分组
  • 接口组描述

鉴权方式描述

在description中描述该组接口的鉴权方式,可以使用超链接等方式也可以直接在其中说明

能力级描述

/** 在description中描述该组接口的能力集 */
 new ApiInfoBuilder().contact(contact).description("api描述1111").version("1.0").title("标题").build();

联系人信息

/** 在contact中描述联系人信息,接口得有负责人 */
new ApiInfoBuilder().contact(contact).description("api描述1111").version("1.0").title("标题").build();
  • 配置类注解是否包含基本注解(Spring 注入)
@Configuration
@EnableSwagger2
public class SwaggerConfig {...}

Controller控制器类(或在接口Interface中定义)

  • 使用注解@api时是否对value description tags属性都进行了描述
	@Api(value = "API测试", description = "API接口描述,主要作为示例使用", tags = "测试1")

  • 注解@api的description属性是否描述了该类接口的概括描述和能力集
	@Api(value = "API测试", description = "API接口描述,能力1,能力2...", tags = "测试1")

  • 注解@apioperation是否对value、notes、tags属性进行描述
	@ApiOperation(value = "call_1接口", notes = "call_1接口描述", tags = "测试1")
  • 注解@apioperation的属性notes是否描述了接口的详细情况和能力

notes描述在pdf中的排版

"\t\tHead: " +
"\t\t\t\t PublicKey -> 公钥\n" +
"\t\t\t\t P -> P参数\n" +
"\t\t\t\t G -> G参数\n" +
"\t\t\t\t Token -> 双向认证令牌\n" +
  • 多个简单参数情况下是否使用注解@ApiImplicitParams
	@ApiImplicitParams({
  		@ApiImplicitParam( value = "姓名", name = "name", required = true, paramType = "query", dataType = "string"),
 		 @ApiImplicitParam( value = "年龄", name = "age", required = true, paramType = "query", dataType = "int"),
  		@ApiImplicitParam( value = "日期", name = "birthday", required = true, paramType = "query", dataType = "date", 	defaultValue = "2017-01-01")
 })
  • 注解@ApiImplicitParam的属性value, name, required, paramType, dataType , defaultValue 等是否都有描述
	value = "日期", name = "birthday", required = true, paramType = "query", dataType = "date", defaultValue = "2017-01-01"

数据传输对象注解

  • 返回数据对象基类是否使用了泛型定义
	@ApiModel(value = "返回数据对象", description = "描述返回数据对象")
	public class Result<T>{}

  • 复杂出入参是否使用数据传输对象进行封装

@ApiModel(value = "返回数据对象", description = "描述返回数据对象")
public class Result<T> {

   @ApiModelProperty(required = true, value = "返回码", dataType = "int", example = "0", position = 0)
   protected int code;

   @ApiModelProperty(required = true, value = "返回信息", dataType = "string", example = "买买买", position = 1)
   protected String message;

   @ApiModelProperty(required = true, value = "其他返回信息", position = 2)
   protected T data;
}
  • 数据传输对象类名上是否有注解@Apimodel
@ApiModel(value = "数据对象", description = "描述返回数据对象")
public Class Dto1{}
  • 数据传输对象的属性注解@apimodelproperty是否对属性required, value, dataType, example, position都有描述(position字段在1.5.X后被废弃,可以不进行设置)
	required = true, value = "返回码", dataType = "int", example = "0", position = 0
  • 数据对象属性需要自定义名称的是否使用了@JsonProperty注解
@ApiModelProperty(required = true, value = "测试自定义名称", dataType = "string", example = "AAACCDSF", position = 3)
@JsonProperty(value = "AAC")
private String AAC;

备注

Swagger接口定义要求明确的出入参的必要性:

1、自动生成接口文档,可以直接生成返回数据体
2、前端开发依赖swagger.json生成的静态Mock Server,可直接模拟构建前端请求返回的数据体。
3、接口说明注解写得越详细,后期联调和前端自主开发都会大大节约时间,这也是前后端分离的初衷。
  • 返回参数要求

1、ActionResult的返回数据体以泛型传入

return new ActionResult<Dto1>();

2、泛型支持类型 [ 前提是返回参数明确 ]集合对象包裹的Dto对象

List<Dto1>、List<Map<String,Dto1>>、Map<String,Dto1>、Dto1 { Dto2,Dto3,…}(对象嵌套)

3、不支持以Object形式、JsonObject形式返回参数

接口描述

ApiModelProperty

  • dateType

    • 类名(引用路径)

/*如果该类不存在或是直接使用名称[无法通过Class.forName(...)生成],原来的返回类型Original会被保留,*/

@ApiModelProperty(dataType = "com.qualified.ReplacedWith")
public Original getOriginal() { ... }


- baseTypes
	 private static final Set<String> baseTypes = newHashSet(
      "int",
      "date",
      "string",
      "double",
      "float",
      "boolean",
      "byte",
      "object",
      "long",
      "date-time",
      "__file",
      "biginteger",
      "bigdecimal",
      "uuid");

更多

扫码关注“架构探险之道”,回复文章名称获取更多源码和文章资源

在这里插入图片描述

知识星球(扫码加入获取源码和文章资源链接)

在这里插入图片描述

坚持原创技术分享,您的支持将鼓励我继续创作!