Swagger在线文档使用教程
springboot整合Swagger2
1、首先创建一个springboot工程,在pom文件内导入依赖
<!--swagger依赖-->
<!--Swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.0</version>
</dependency>
<!--Swagger-ui界面-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.0</version>
</dependency>
2、在springboot工程内的项目运行无误后,创建配置类SwaggerConfig
@Configuration // 配置类
@EnableSwagger2 // 开启Swagger2
public class SwaggerConfig {
/**
* 配置了Swagger的Docket的Bean实例
* 可以有多个
* @return
*/
@Bean
public Docket docket(Environment environment) {
// 获取项目环境
// 设置要显示的Swagger2环境
Profiles profiles = Profiles.of("dev");
// 监听 通过environment.acceptsProfiles判断是否处在自己设定的环境
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
// Select a spec默认值
.groupName("茶碗儿")
// 是否开启swagger2
// .enable(false)
// 监听
.enable(flag)
.select()
// RequestHandlerSelectors 配置要扫描接口的方式
// basePackage 指定扫描的包
// any 扫描全部
// none 不扫描
// withClassAnnotation 扫描类上的注解,参数是一个注解的反射对象
// withMethodAnnotation 扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.changgou.controller"))
// 过滤路径
// .paths(PathSelectors.ant("/changgou/**"))
.build();
}
@Bean
public Docket docket1(Environment environment) {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("花生糖");
}
// 配置Swagger2信息
private ApiInfo apiInfo() {
// 作者信息
Contact contact = new Contact("茶碗儿", "https://www.cnblogs.com/chawaner/", "*******@qq.com");
return new ApiInfo(
// 大标题
"畅购商城",
// 描述
"畅购商城在线API",
// 版本
"v1.0",
// 服务组织url
"https://www.cnblogs.com/chawaner/",
// 作者信息
contact,
// 开源版本号
"Apache 2.0",
//// 开源版本url
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList<VendorExtension>());
}
}
3、在JavaBean中加上注解
@ApiModel(description = "Result", value = "Result")
@Data // lombok注解
public class Result<T> implements Serializable {
@ApiModelProperty(value = "执行是否成功,true:成功,false:失败", required = true)
private boolean flag; // 是否成功
@ApiModelProperty(value = "返回状态码,20000:成功,20001:失败,20002:用户名或密码错误,20003:权限不足,20004:远程调用失败,20005:重复操作,20006:没有对应的抢购数据", required = true)
private Integer code; // 返回码
@ApiModelProperty(value = "提示信息", required = true)
private String message; // 返回消息
@ApiModelProperty(value = "逻辑数据", required = true)
private T data; // 返回数据
public Result(boolean flag, Integer code, String message, Object data) {
this.flag = flag;
this.code = code;
this.message = message;
this.data = (T) data;
}
public Result(boolean flag, Integer code, String message) {
this.flag = flag;
this.code = code;
this.message = message;
}
public Result() {
this.flag = true;
this.code = StatusCode.OK;
this.message = "操作成功!";
}
}
4、在controller类中加入注解
@Api(
value = "用户品牌操作",
tags = {"用户品牌操作接口"})
@RestController
@RequestMapping(value = "/brand")
@CrossOrigin // 跨域访问:域名、端口、协议不一致
public class BrandController {
@Autowired private BrandService brandService;
/** 查询所有 */
@ApiOperation("查询所有品牌信息")
@GetMapping
public Result<List<Brand>> findAll() {
// 查询所有品牌信息
List<Brand> brands = brandService.findAll();
// 响应结果封装
return new Result<List<Brand>>(true, StatusCode.OK, "查询品牌集合成功!", brands);
}
/** 根据主键id查询 */
@ApiOperation("据主键id查询") // 接口 放在方法上
@GetMapping(value = "/{id}")
public Result<Brand> findById(
@ApiParam(value = "传入的id") @PathVariable(value = "id") Integer id) {
Brand brand = brandService.findById(id);
return new Result<Brand>(true, StatusCode.OK, "根据id查询品牌成功!", brand);
}
/**
* 增加品牌
*
* @param brand
*/
@ApiOperation("增加品牌")
@PostMapping
public Result add(@ApiParam(value = "要增加的品牌信息") @RequestBody Brand brand) {
brandService.add(brand);
return new Result(true, StatusCode.OK, "添加品牌成功!");
}
/**
* 根据ID修改品牌数据
*
* @param id
* @param brand
* @return
*/
@ApiOperation("根据ID修改品牌信息")
@PutMapping(value = "/{id}")
public Result update(
@ApiParam(value = "输入的id", example = "1") @PathVariable(value = "id") Integer id,
@ApiParam(value = "brand") @RequestBody Brand brand) {
brand.setId(id);
brandService.update(brand);
return new Result(true, StatusCode.OK, "根据ID修改品牌成功!");
}
/**
* 根据ID删除品牌数据
*
* @param id
*/
@ApiOperation("根据ID删除品牌")
@DeleteMapping(value = "/{id}")
public Result delete(@ApiParam(value = "输入的id") @PathVariable(value = "id") Integer id) {
brandService.delete(id);
return new Result(true, StatusCode.OK, "根据ID删除品牌数据成功!");
}
/** 根据品牌信息多条件搜索 */
@ApiOperation("根据品牌信息多条件搜索")
@PostMapping(value = "/search")
public Result<List<Brand>> findList(@ApiParam(value = "查询条件") @RequestBody Brand brand) {
List<Brand> brands = brandService.findList(brand);
return new Result<List<Brand>>(true, StatusCode.OK, "根据品牌信息多条件搜索成功!", brands);
}
/**
* 分页查询实现
*
* @param page:当前页
* @param size:每页显示条数
* @return
*/
@ApiOperation("分页查询实现")
@GetMapping(value = "/search/{page}/{size}")
public Result<PageInfo<Brand>> findPage(
@ApiParam(value = "当前页") @PathVariable(value = "page") Integer page,
@ApiParam(value = "显示的条数") @PathVariable(value = "size") Integer size) {
PageInfo<Brand> pageInfo = brandService.findPage(page, size);
return new Result<PageInfo<Brand>>(true, StatusCode.OK, "分页查询成功!", pageInfo);
}
/**
* 分页查询 + 条件搜索
*
* @param brand:搜索条件
* @param page:当前页
* @param size:每页显示条数
* @return
*/
@ApiOperation("分页查询 + 条件搜索")
@PostMapping(value = "/search/{page}/{size}")
public Result<PageInfo<Brand>> findPage(
@ApiParam(value = "查询条件") @RequestBody Brand brand,
@ApiParam(value = "当前页") @PathVariable(value = "page") Integer page,
@ApiParam(value = "显示的条数") @PathVariable(value = "size") Integer size) {
PageInfo<Brand> pageInfo = brandService.findPage(brand, page, size);
return new Result<PageInfo<Brand>>(true, StatusCode.OK, "分页查询成功!", pageInfo);
}
}
5、配置文件application.yml中配端口号和端口扫描
注意:
1.端口号是从浏览器打开swagger-ui时的端口
2.配置端口扫描是为了设置在开发时开启swagger在线文档,在产品发布后不开启
3.注意看上面的SwaggerConfig配置类里面的:Profiles profiles = Profiles.of("dev");
扫描包含dev的配置文件,所以打开ui界面就得18082端口
application.yml
#端口的配置
server:
port: 18081
#设置对dev的端口开启swagger
#本来是访问http://localhost:18081/swagger-ui.html打开swagger-ui界面
#配置了这个之后,打开swagger-ui界面就要访问http://localhost:18082/swagger-ui.html
spring:
profiles:
active: dev
application-dev.yml
server:
port: 18082
application-pro.yml
server:
port: 18083
6、Swagger常用注解
位置 | 注解 | 说明 |
---|---|---|
controller | @Api | 对请求类的说明 |
方法 | @ApiOperation | 方法的说明 |
方法 | @ApiImplicitParams、@ApiImplicitParam | 方法的参数的说明;@ApiImplicitParams 用于指定单个参数的说明 |
方法 | @ApiResponses、@ApiResponse | 方法返回值的说明 ;@ApiResponses 用于指定单个参数的说明 |
对象 | @ApiModel | 用在JavaBean类上,说明JavaBean的 用途 |
对象 | @ApiModelProperty | 用在JavaBean类的属性上面,说明此属性的的含议 |
@Api:
@Api:放在 请求的类上,与 @Controller 并列,说明类的作用,如用户模块,订单类等。
tags="说明该类的作用"
value="该参数没什么意义,所以不需要配置"
示例
@Api(tags="订单模块")
@Controller
public class OrderController { }
@Api其他属性配置:
属性名称 | 备注 |
---|---|
value | url的路径值 |
tags | 如果设置这个值、value的值会被覆盖 |
description | 对api资源的描述 |
basePath | 基本路径 |
position | 如果配置多个Api 想改变显示的顺序位置 |
produces | 如, “application/json, application/xml” |
consumes | 如, “application/json, application/xml” |
protocols | 协议类型,如: http, https, ws, wss. |
authorizations | 高级特性认证时配置 |
hidden | 配置为true ,将在文档中隐藏 |
@ApiOperation:
@ApiOperation:"用在请求的方法上,说明方法的作用"
value="说明方法的作用"
notes="方法的备注说明"
@ApiImplicitParams、@ApiImplicitParam:方法参数的说明
@ApiImplicitParams:用在请求的方法上,包含一组参数说明
@ApiImplicitParam:对单个参数的说明
name:参数名
value:参数的说明、描述
required:参数是否必须必填
paramType:参数放在哪个地方
· query --> 请求参数的获取:@RequestParam
· header --> 请求参数的获取:@RequestHeader
· path(用于restful接口)--> 请求参数的获取:@PathVariable
· body(请求体)--> @RequestBody User user
· form(普通表单提交)
dataType:参数类型,默认String,其它值dataType="Integer"
defaultValue:参数的默认值
示例:
@Api(tags="用户模块")
@Controller
public class UserController { @ApiOperation(value="用户登录",notes="随边说点啥")
@ApiImplicitParams({
@ApiImplicitParam(name="mobile",value="手机号",required=true,paramType="form"),
@ApiImplicitParam(name="password",value="密码",required=true,paramType="form"),
@ApiImplicitParam(name="age",value="年龄",required=true,paramType="form",dataType="Integer")
})
@PostMapping("/login")
public JsonResult login(@RequestParam String mobile, @RequestParam String password,
@RequestParam Integer age){
//...
return JsonResult.ok(map);
}
}
@ApiResponses、@ApiResponse:方法返回值的状态码说明
@ApiResponses:方法返回对象的说明
@ApiResponse:每个参数的说明
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类
示例:
@Api(tags="用户模块")
@Controller
public class UserController { @ApiOperation("获取用户信息")
@ApiImplicitParams({
@ApiImplicitParam(paramType="query", name="userId", dataType="String", required=true, value="用户Id")
})
@ApiResponses({
@ApiResponse(code = 200, message = "请求成功"),
@ApiResponse(code = 400, message = "请求参数没填好"),
@ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")
})
@ResponseBody
@RequestMapping("/list")
public JsonResult list(@RequestParam String userId) {
...
return JsonResult.ok().put("page", pageUtil);
}
}
@ApiModel:用于JavaBean上面,表示对JavaBean 的功能描述
@ApiModel的用途有2个:
当请求数据描述,即 @RequestBody 时, 用于封装请求(包括数据的各种校验)数据;
当响应值是对象时,即 @ResponseBody 时,用于返回值对象的描述。
Swagger在线文档使用教程的更多相关文章
- .net core的Swagger接口文档使用教程(二):NSwag
上一篇介绍了Swashbuckle ,地址:.net core的Swagger接口文档使用教程(一):Swashbuckle 讲的东西还挺多,怎奈微软还推荐了一个NSwag,那就继续写吧! 但是和Sw ...
- swagger在线文档和离线文档
spring boot项目的swagger文档. 依赖从spring boot的基础上增加.参考pom.xml: <dependency> <groupId>org.sprin ...
- .net core的Swagger接口文档使用教程(一):Swashbuckle
现在的开发大部分都是前后端分离的模式了,后端提供接口,前端调用接口.后端提供了接口,需要对接口进行测试,之前都是使用浏览器开发者工具,或者写单元测试,再或者直接使用Postman,但是现在这些都已经o ...
- swagger:API在线文档自动生成框架
传统的API从开发测试开始我们经常借用类似Postman.fiddle等等去做接口测试等等工具:Swagger 为API的在线测试.在线文档提供了一个新的简便的解决方案: NET 使用Swagger ...
- 求你别再用swagger了,给你推荐几个在线文档生成神器
前言 最近公司打算做一个openapi开放平台,让我找一款好用的在线文档生成工具,具体要求如下: 必须是开源的 能够实时生成在线文档 支持全文搜索 支持在线调试功能 界面优美 说实话,这个需求看起来简 ...
- Mergely – 免费的在线文档对比和合并工具
任何类型的文件(无论是否代码),我们可能要比较不同的版本,看发生了什么变化. 有些编辑器都有这个内置功能,其中一些则没有. Mergely 是一个免费使用的 Web 应用程序,帮你你迅速作出文档的差异 ...
- 添加swagger api文档到node服务
swagger,一款api测试工具,详细介绍参考官网:http://swagger.io/ ,这里主要记录下怎么将swagger api应用到我们的node服务中: 1.任意新建node api项目, ...
- SpringBoot整合Swagger2搭建API在线文档
Swagger,中文"拽"的意思,它是一个功能强大的在线API在线文档,目前它的版本为2.x,所以称为Swagger2.Swagger2提供了在线文档的查阅和测试功能.利用Swag ...
- swagger接口文档
1 在Visual Studio 中创建一个Asp.NET WebApi 项目,项目名:Com.App.SysApi(本例创建的是 .net 4.5 框架程序) 2 打开Nuget 包管理软件,查 ...
随机推荐
- ClouderaManager安装kafka报错
是因为默认的java heap size是50M,将broker_max_heap_size参数设置为512M后,重启kafka服务即可
- C#下通过wbemtest和WMI Code Cretor更加高效的访问WMI
能找到这篇博客的,相信都是有操作WMI需求的了.但是不知道如何快速验证.并集成到C#来操作WMI.我们分为3步: ##第一步:官网(或跟硬件开发WMI的人沟通你需要的接口和参数定义,如果是和硬件开发的 ...
- Hive源码上手及问题解决
一.编译准备 1.下载源码包 https://github.com/apache/hive/archive/refs/tags/rel/release-2.3.7.zip 或使用git直接拉取 无法解 ...
- 高校表白App-团队冲刺第十天
今天要做什么 做一个类似于淘宝的小云播报 做了什么 没有完全实现,轮转实现,功能没有 遇到的问题 遇到的问题好多啊,感觉写一天都写不完,我还是好好学习一下再重新写吧
- python + mysql 实现表删除数据
实例如下: import pymysqldef Delete_From(): #打开数据库链接 db = pymysql.connect("localhost","roo ...
- python -- 程序异常与调试(程序调试)
一.程序调试 A.使用assert语句检测程序代码中的错误. assert 表达式[, 参数] 如果表达式为True,则继续往下运行:如果为False,则抛出一个AssertionError异常,并且 ...
- python -- 面向对象编程(属性、方法)
一.属性 对象的属性(attribute)也叫做数据成员(data member). 如果想指向某个对象的属性,可以使用格式: object.attribute 属性又分为:私有属性和公有属性. 私有 ...
- 算法leetcode二分算法
二分算法通常用于有序序列中查找元素: 有序序列中是否存在满足某条件的元素: 有序序列中第一个满足某条件的元素的位置: 有序序列中最后一个满足某条件的元素的位置. 思路很简单,细节是魔鬼. 一.有序序列 ...
- 《面试八股文》之 Redis 16卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...
- 技术期刊 · 天光台高未百尺 | Uber 工程师的 JS 算法课;大数据时代的个人隐私;设计师的 Github;告别 PPT 工程师;从零开始实现的像素画
蒲公英 · JELLY技术期刊 Vol.42 这是一个最好的时代,多样化的平台给了所有人成长发展的机会,各种需求和解决需求的人让人大开眼界:但这也并不是完美的时代,"前端还需要懂什么算法?& ...