前言:好久没写博客了,年底到前段日子很忙,加班比较多,加上本人不喜欢CV大法,这段时间一直没写博客,正好最近基于公司新项目学习swagger,故写下这篇文章供自己总结复习,供新人参考^_^
。
swagger是一个用于后台接口生成描述文档或者根据yaml文件生成后台接口的工具集,包括swagger UI进行功能测试、swagger Codegen进行代码生成等组件,这里介绍一下公司最近用到的使用swagger Codegen根据自定义的yaml文件生成对应的后台接口代码。
Swagger包含的工具集:
swagger的yaml文件符合Open API规范,详细内容可参考openAPI3.0官网https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md,内容定义了接口的方法名,入参参数类型、是否必须、方法返回值、访问地址等。
OpenAPI文档可以由单个文档组成,也可以根据用户的意愿分为多个相互连接的部分。在后一种情况下,$ref必须在规范中使用字段来引用JSON模式定义中的以下部分。如下为user.yaml的内容。
#必要字段!Swagger规范版本,必须填2.0,否则该YAML将不能用于Swagger其他组件
swagger: '2.0'
#必要字段!描述API接口信息的元数据
info:
#接口标题
title: swagger说明文档
#接口文档的描述
description: 学习Swagger
#版本号
version: 1.0.0
#Swagger会提供测试用例,host指定测试时的主机名,如果没有指定就是当前主机,可以指定端口.
host: 127.0.0.1
#定义的api的前缀,必须已/开头,测试用例的主机则为:host+bashPath
basePath: /userapi
#标签组
tags:
- name: User
description: 用户模块接口
#指定调用接口的协议,必须是:"http", "https", "ws", "wss".默认是http.-表示是个数组元素,即schemes接受一个数组参数
schemes:
- http
- https
#对应与http协议头request的Accept,调用者可接受类型,默认是*/*,定义的类型必须是http协议定义的 Mime Types,RestfulAPI一般定义成application/json
#这两个是对所有接口的全局设置,在细化的接口中是还可以对应这两个属性来覆盖全局属性
#方便swagger-ui测试,先不限制请求格式:浏览器请求默认没有该头信息"Content-Type":"application/json"出现415
#接口能消费的数据类型格式,在postman测试没问题,在swagger-ui界面测试因为默认没有这个content-type请求头所以先取消,正式开发前端人员会写死
#consumes:
# - application/json
#接口返回的数据类型格式
produces:
- application/json
#必要字段!定义可有可操作的API
paths:
/users:
#必要字段!定义HTTP操作方法,必须是http协议定义的方法
get:
#接口概要
summary: 查询用户列表
#接口描述
description: 查询出所有用户的所有信息
#接口方法名
operationId: getUsers
#标签,方便快速过滤出User相关的接口
tags:
- User
#返回值描述,必要字段
responses:
#返回的http状态码
200:
description: 所有用户信息或者用户的集合信息
#描述返回值
schema:
$ref: '#/definitions/UsersResponse'
#执行出错的处理
default:
description: 操作异常,执行失败.返回信息描述错误详情
schema:
$ref: '#/definitions/ExceptionResponse'
#针对于同一个url定义两个不同的方法,表示两个接口
post:
#接口概要
summary: 新增一个用户
#接口描述
description: 新增一个用户
operationId: addUser
#标签,方便快速过滤出User相关的接口
tags:
- User
#请求参数
parameters:
#参数key
- name: user
#传递方法,formData表示表单传输,还有query表示url拼接传输,path表示作为url的一部分
#body表示http头承载参数(body只能有一个,有body不能在有其他的)
in: body
#参数描述
description: 新增用户信息
#参数是否必要,默认false
required: true
schema:
$ref: '#/definitions/User'
responses:
#返回的http状态码
200:
description: 通过返回值来标示执行结果 返回true表示执行成功
schema:
$ref: '#/definitions/ '
#执行出错的处理
default:
description: 操作异常,执行失败.返回信息描述错误详情
schema:
$ref: '#/definitions/ExceptionResponse'
/query:
get:
summary: 根据用户id查询用戶信息
description: 查询用戶信息
operationId: getUser
tags:
- User
parameters:
- name: id
in: query
description: 根据id查询用戶信息,是唯一标识
required: true
type: integer
responses:
200:
description: 用户的信息
schema:
$ref: '#/definitions/User'
default:
description: 操作异常,执行失败.返回信息描述错误详情
schema:
$ref: '#/definitions/ExceptionResponse'
/user/{
id}:
#{id}表示id为请求参数,例如/users/1,/users/2都是对该API的请求,此时id即为1和2
#上面接口中定义了{id},则参数列表中必须包含参数id,并且请求类型in为path
#http定义的delete方法,删除一个资源
delete:
summary: 删除用户
description: 删除某个用户的信息,被删除的用户将无法登陆
operationId: deleteUser
parameters:
- name: id
in: path
type: integer
required: true
description: 用户的唯一标示符
tags:
- User
responses:
200:
description: 通过返回值来标示执行结果 返回true表示执行成功
schema:
$ref: '#/definitions/SuccessResponse'
default:
description: 操作异常,执行失败.返回信息描述错误详情
schema:
$ref: '#/definitions/ExceptionResponse'
#http定义的put方法,表示修改一个资源
put:
summary: 用户信息修改
description: 修改用户信息(用户名别名)
operationId: updateUser
parameters:
- name: id
in: path
description: 用户名,要修改的数据的唯一标识符
required: true
type: integer
- name: user
in: body
description: 新的用户信息
required: true
type: string
schema:
$ref: '#/definitions/User'
tags:
- User
responses:
200:
description: 通过返回值来标示执行结果 返回true表示执行成功
schema:
$ref: '#/definitions/SuccessResponse'
default:
#描述错误信息
description: 操作异常,执行失败.返回信息描述错误详情
schema:
$ref: '#/definitions/ExceptionResponse'
definitions:
User:
#值类型
type: object
#定义属性
properties:
#属性名
userId:
#参数类型,可选的包括array,integer,boolean,string.使用array必须使用items
type: integer
#描述
description: 用户的唯一id
userName:
type: string
description: 用户名
gender:
type: string
description: 性別
age:
type: integer
format: int32
description: 年齡
dateOfBirth:
type: string
format: date
description: 生日
AddUserRequest:
#值类型
type: object
#定义属性
properties:
#属性名
userName:
type: string
description: 用户名
gender:
type: string
description: 性別
age:
type: integer
format: int32
description: 年齡
dateOfBirth:
type: string
format: date
description: 生日
UsersResponse:
properties:
users:
description: 返回的user列表
#针对array,每个条目的格式,type定义为array.必要填写items
type: array
items:
#引用在definitions下定义的Users
$ref: "#/definitions/User"
ExceptionResponse:
type: object
properties:
code:
type: string
description: 错误码
msg:
type: string
description: 错误信息
SuccessResponse:
type: object
properties:
status:
#类型
type: boolean
#描述
description: 是否成功
其中parameters属性解释
name: limit //参数的名字
in: query //描述参数以什么方式怎么传递到后台
type: integer //类型
required: false //是否必须
default: 20 //默认
minimum: 1 //最小值
maximum: 100 //最大值
description: The numbers of items to return. //参数的描述
我使用的是swagger-codegen-cli-2.4.5.jar这个版本,现在是最新的,读者可根据maven仓库下载列表下载较新的:https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/
比如我的jar目录在D:\hl\mvp目录下:
java -jar swagger-codegen-cli-2.4.5.jar generate -i D:\hl\mvp\user.yaml -c D:\hl\mvp\config-user.json -l spring-o demo/java
命令解释:
config-user.json是描述生成的文件的目录结构,代码一些基础信息:
{
// 生成***Api.java文件包名
"apiPackage": "com.formssi.mvp.controller.api",
//指定生成pom.xml的artifactId的值
"artifactId": "mvp",
//基础路径
"basePackage": "com.formssi.mvp",
"dateLibrary": "java8",
//允许使用标签组
"useTags": true,
"delegatePattern": true,
"groupId": "com.formssi",
"hideGenerationTimestamp": true,
"java8": true,
"dateLibrary": "java8-localdatetime",
//和上面命令-l参数一样,同时写命令的优先!!,spring的更简单,
"language": "spring",
// 生成的数据模型Java文件包名
"modelPackage": "com.formssi.mvp.model",
// 生成的swagger配置文件的包名
"configPackage": "com.formssi.mvp.config"
}
配置文件其他参数:
“developerName”: “hl”, // 开发者姓名
“developerEmail”: “”, // 开发者邮件
“developerOrganization”: “”, // 开发者组织
“invokerPackage”: “com.mvp.test”, //项目包名
生成的这些文件里,src文件下的文件和pom.xml文件是对我们最有用的。
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiError :发生错误返回的信息
@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数