Swagger
前后端分离时代:
- 后端:后端控制层,服务层,数据访问层【后端团队】
- 前端:前端控制层,视图层【前端团队】
。伪造后端数据Json。已经存在了,不需要后端,前端工程依旧能够跑起来
前后端如何交互===> API
前后端相对独立,松耦合
前后端甚至可以部署在不同的服务器上;
产生一个问题:
- 前后端集成联调,前端人员和后端人员无法做到’'即使协商,尽早解决”,最终导致问题
解决方案:
- 首先指出schema[计划的提纲],实时更新最新的API,降低集成的风险。
- 早些年:指定word 计划文档;
- 前后端分离:
Swagger简介
- 号称世界上最流行的Api框架;
- RestFul Api 文档在线自动生成工具=> Api文档与Api定义更新
- 直接运行,可以在线测试API接口
- 支持多种语言:(Java PHP…)
Swagger
官网:https://swagger.io/
在项目中Swagger 需要springbox;
- swagger2
- ui
SpringBoot 集成Swagger
1.新建SpringBoot 项目
2.导入相关依赖
io.springfox springfox-swagger2 2.9.2
io.springfox springfox-swagger-ui 2.9.2
3.编写一个Hello工程
4.编写Swagger
@Configuration
@EnableSwagger2 // 开启Swagger2
public class SwaggerConfig {
}
5.测试运行
配置Swagger
Swagger的bean实例Docker;
// 配置了Swagger的bean 实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo());
}
// 配置Swagger信息=apiInfo
private ApiInfo apiInfo(){
// 作者信息
Contact contact = new Contact("小明", "https://www.baidu.com/", "285959595@qq.com");
return new ApiInfo(
"Swagger API 文档",
"Swagger 文档",
"1.0",
"https://www.baidu.com/",
contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
Swagger配置扫描接口
Docket.select ()
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// RequestHandlerSelectors,配置要扫描接口的方式
// basePackage:指定扫描的包
// any 扫描全部
// none 不扫描
// withClassAnnotation 扫描类上的注解,参数是一个注解的反射对象
// withMethodAnnotation 扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.swagger.swagger_demo.controller"))
// 过滤什么路径
.paths(PathSelectors.ant("/swagger/**"))
.build();
}
配置是否启动Swagger
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
// enable 是否启动Swagger ,如果为false ,则Swagger 不能在浏览器中访问
.enable(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.swagger.swagger_demo.controller"))
// 过滤什么路径
// .paths(PathSelectors.ant("/swagger/**"))
.build();
}
我只希望我的Swagger 在生产环境使用,在发布时候不使用?
- 判断是不是生成环境
- 注入enable(flag)
@Bean
public Docket docket(Environment environment){
// 设置要显示的Swagger 环境
Profiles profiles =Profiles.of("dev","test");
// 通过environment.acceptsProfiles 判断当前是否处在自己设定的环境当中
boolean flag = environment.acceptsProfiles(profiles);
// 获取项目中的环境
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
// enable 是否启动Swagger ,如果为false ,则Swagger 不能在浏览器中访问
.enable(flag)
.select()
.apis(RequestHandlerSelectors.basePackage("com.swagger.swagger_demo.controller"))
// 过滤什么路径
// .paths(PathSelectors.ant("/swagger/**"))
.build();
}
配置文件
application.properties
spring.profiles.active=dev
生产环境可以
spring.profiles.active=dev
发布环境
spring.profiles.active=pro
配置API文档分组
.groupName("哈士奇")
如何设置多个分组
@Bean
public Docket docket1(){
return new Docket(DocumentationType.SWAGGER_2).groupName("A");
}
@Bean
public Docket docket2(){
return new Docket(DocumentationType.SWAGGER_2).groupName("B");
}
@Bean
public Docket docket3(){
return new Docket(DocumentationType.SWAGGER_2).groupName("C");
}
实体类配置
package com.swagger.swagger_demo.pojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("用户实体类")
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
controller
package com.swagger.swagger_demo.controller;
import com.swagger.swagger_demo.pojo.User;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 86182
*
*
*/
@RestController
public class HelloController {
/** 默认请求
* @return hello
*/
@GetMapping("/hello")
public String hello(){
return "hello";
}
/**默认请求
*
* @return user
* 只要我们的接口中,有返回值存在实体类,他就会被扫描到Swagger中
*/
@PostMapping(value = "/user")
public User user(){
return new User();
}
// operation 控制类
@GetMapping("/hello1")
@ApiOperation("hello1 控制类")
public String hello1(@ApiParam("用户名") String username){
return "hello1"+username;
}
}
@ApiOperation("Post测试类")
@PostMapping(value = "/postt")
public User postt(@ApiParam("用户名") User user){
int i = 5/0;
return user;
}
总结:
1.我们可以通过Swagger 给一些比较难的属性或者接口,增加注释信息
- 接口文档实施更新
- 可以在线测试
Swagger是一个优秀的工具,几乎所有大公司都有使用它。
【注意点】在正式发布的时候,关闭Swagger !!! 出于安全考虑,而且节省内存。
;
}
}
@ApiOperation(“Post测试类”)
@PostMapping(value = “/postt”)
public User postt(@ApiParam(“用户名”) User user){
int i = 5/0;
return user;
}
总结:
1.我们可以通过Swagger 给一些比较难的属性或者接口,增加注释信息
2. 接口文档实施更新
3. 可以在线测试
Swagger是一个优秀的工具,几乎所有大公司都有使用它。
【注意点】在正式发布的时候,关闭Swagger !!!! 出于安全考虑,而且节省内存。