在现在微服务满天飘的年代,一个稍微大点的项目就可能有10几个服务,每个服务会产生很多API互相调用,如果没有一个自动生成API文档的工具,那就有的搞了! Swagger是一个简单但功能强大的API表达工具。它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言,都在支持和使用Swagger。使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。 来体验一把吧!
Swagger
使用swagger能帮我们生成API文档,那么它会生成什么样的API文档呢?
OpenAPI
OpenAPI规范是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程。OpenAPI规范帮助我们描述一个API的基本信息。
比如:
- 有关该API的一般性描述
- 可用路径(/资源)
- 在每个路径上的可用操作(获取/提交...)
- 每个操作的输入/输出格式
根据OpenAPI规范编写的二进制文本文件,能够像代码一样用任何VCS工具管理起来一旦编写完成,API文档可以作为:
- 需求和系统特性描述的根据
- 前后台查询、讨论、自测的基础
- 部分或者全部代码自动生成的根据
- 其他重要的作用,比如开放平台开发者的手册...
编写API文档
Swagger官方提供了API文档在线编辑器:
http://editor.swagger.io/
我估计你现在打开的很慢,我已经打开了并截好了图等你来看:
swagger在线文档编辑
左边编辑,右边随时预览,我这里提供了一个文档案例:
代码语言:javascript复制swagger: '2.0'
info:
version: 1.0.0
title: 测试Swagger 文档API
description: 测试Swagger 文档API
contact:
name: 行百里er
url: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI1MDU1MjkxOQ==#wechat_redirect
email: 888@qqq.com
license:
name: MIT
url: http://opensource.org/licenses/MIT
schemes:
- http
host: traveler100.com
basePath: /api/v1
paths:
/user/{mobile}:
get:
summary: 根据手机号码获取一个用户信息
description: 根据手机号码获取一个用户信息
parameters:
- name: mobile
in: path
required: true
description: 手机号码
type: string
responses:
200:
description: OK
/user/listUsers:
get:
summary: 返回List 包含所有用户
description: 返回List 包含所有用户
parameters:
- name: pageSize
in: query
description: 每页显示多少
type: integer
- name: pageNum
in: query
description: 当前第几页
type: integer
responses:
200:
description: OK
schema:
type: array
items:
required:
- username
properties:
username:
type: string
password:
type: string
效果图:
swagger在线编辑效果图
swagger在线编辑效果图-展开
屌不屌?
这种是先写文档再出代码,代码里会自动生成一些注解。
but,如果丝袜哥只提供这个,那就太差点意思了,需要自己编写文档,而且yml格式的东西,一不注意多个空格就会报错,还是没有解放我编写文档的双手!
所以,如你所料,它很贴心的提供了自动帮我们生成文档的神器!
Swagger集成SpringBoot
官方依赖:
代码语言:javascript复制<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
官方的这个用起来比较麻烦,我就不演示了,我们看一下第三方的专门使用spring-boot-starter的。
第三方spring-boot-starter-swagger
添加pom依赖
代码语言:javascript复制<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
配置文件
代码语言:javascript复制swagger:
ui-config:
api-sorter: alpha
json-editor: true
display-request-duration: true
title: 测试Swagger 文档API
contact:
name: 公众号:行百里er
email: 19193127929@qq.com
url: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI1MDU1MjkxOQ==#wechat_redirect
base-package: com.travler100.test.swaggerdemo.controller
这个是我做演示的配置文件,配置项比较少。完整的配置可参考spring-boot-starter-swagger
项目的github官网:
https://github.com/SpringForAll/spring-boot-starter-swagger
配置说明:
代码语言:javascript复制- swagger.enabled=是否启用swagger,默认:true
- swagger.title=标题
- swagger.description=描述
- swagger.version=版本
- swagger.license=许可证
- swagger.licenseUrl=许可证URL
- swagger.termsOfServiceUrl=服务条款URL
- swagger.contact.name=维护人
- swagger.contact.url=维护人URL
- swagger.contact.email=维护人email
- swagger.base-package=swagger扫描的基础包,默认:全扫描
- swagger.base-path=需要处理的基础URL规则,默认:/**
- swagger.exclude-path=需要排除的URL规则,默认:空
- swagger.host=文档的host信息,默认:空
- swagger.globalOperationParameters[0].name=参数名
- swagger.globalOperationParameters[0].description=描述信息
- swagger.globalOperationParameters[0].modelRef=指定参数类型
- swagger.globalOperationParameters[0].parameterType=指定参数存放位置,可选header,query,path,body.form
- swagger.globalOperationParameters[0].required=指定参数是否必传,true,false
项目中启用注解
- @EnableSwagger2Doc 作用于启动类
@SpringBootApplication
@EnableSwagger2Doc
public class SwaggerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerDemoApplication.class, args);
}
}
- @Api 作用于Controller、@ApiOperation 作用于方法
@RestController
@Api(tags = {"用户管理API"})
public class UserController {
@ApiOperation(value = "获取用户列表")
@RequestMapping(value = "/user/listUsers", method = RequestMethod.GET)
public CommonResult<List<User>> listUsers() {
List<User> list = new ArrayList<>();
User u1 = new User();
u1.setId(1L);
u1.setUserName("张三");
u1.setMobile("13888888888");
u1.setAge(18);
u1.setGender((byte) 1);
User u2 = new User();
u2.setId(2L);
u2.setUserName("韩梅");
u2.setMobile("13888888889");
u2.setAge(20);
u2.setGender((byte) 0);
list.add(u1);
list.add(u2);
return CommonResult.success(list);
}
@ApiOperation(value = "根据手机号码获取用户信息")
@RequestMapping(value = "/user/{mobile}", method = RequestMethod.GET)
public CommonResult<User> user(@PathVariable("mobile") String mobile) {
User u = new User();
u.setId(new Random().nextLong()*1000);
u.setUserName("张三");
u.setMobile(mobile);
u.setAge(18);
u.setGender((byte) 1);
return CommonResult.success(u);
}
}
- @ApiModelProperty 作用于实体类属性
@Data
public class User {
@ApiModelProperty(value = "编号", name = "id", dataType = "Long", example = "302918")
private Long id;
@ApiModelProperty(value = "姓名", name = "userName", dataType = "String", example = "张三")
private String userName;
@ApiModelProperty(value = "手机号", name = "mobile", dataType = "String", example = "13888888888")
private String mobile;
@ApiModelProperty(value = "性别", name = "gender", dataType = "Byte", example = "1")
private Byte gender;
@ApiModelProperty(value = "年龄", name = "gender", dataType = "Integer", example = "18")
private Integer age;
}
看效果
启动SpringBoot项目,输入地址:http://localhost:8011/swagger-ui.html
swagger运行
好舒服啊!这就是我期待的效果!
我们点开一个Controller对应的API看一下:
这里展示了这个Controller里所有的API列表,再点开/user/{mobile}
看一下:
API详情
挖槽,还可以直接测试API,赶紧试试,点Try it out
:
执行API
Niubility!
小结
没有小结,快来试试swagger吧!
END
随便推荐一下
- ES Java API之增删改查
- Elasticsearch初体验-创建Index,Document以及常见的ES查询
- 内核中PageCache和java文件系统IO/NIO以及内存中缓冲区的作用
- 通过Java Socket编程观察内核级TCP的三次握手
- 深入底层探析网络编程之多路复用器(select,poll,epoll)
看完点赞,养成习惯。 举手之劳,赞有余香。