后端时代:
前端只用管理静态页面,将整个html交给后端;后端的模板引擎JSP, 后端 是主力。
前后端分离时代:
后端:后端控制层,服务层,数据访问层
前端:前端控制层,视图层
前端可以伪造后端的数据,通过json跟后端进行交互。现在已经不需要后端,前端工程依然可以运行起来。
前后端交互方式:API接口
前后端相对独立,松耦合
前后端甚至可以部署到不同的服务器上面
产生的问题:
前后端集成联调,前端人员和后端人员无法做到及时协商以便尽快解决问题,最终将导致问题集中爆发;简单来讲,也就是前端不知道后端将提供给前端的接口名字以及后端将传送给前端的数据以及数据类型。。
解决方案:
首先应该指定计划,实时更新后端提供给前端的最新API,来降低集成的风险。
比如早些年,会指定word计划文档
前后端分离:
前端测试后端的接口:postman
后端提供接口,需要实时更新最新的消息以及改动
不太方便:这样需要特定去下载安装postman,但是笔者觉得国产接口测试工具Apiposth还是比较好用的,相对于postman来说
RestFull Api文档在线自动生成工具==》Api文档与API接口定义同步更新
直接运行,可以在线测试API接口
支持多种语言:java , Php
在项目中使用swagger需要导包
swagger2
ui
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>2.9.2version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.9.2version>
dependency>
这里注意Springboot2.6版本之后和Swagger版本不匹配导致项目出错,降低Springboot版本就好啦,这里用2.1.7.RELEASE版本
<version>2.1.7.RELEASEversion>
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "haohao";
}
}
@Configuration // 标明是配置类
@EnableSwagger2 //开启swagger功能
public class SwaggerConfig {
/**
* 配置了Swagger 的Dockerd的bean实例
*
*/
@Bean
public Docket docket(){//该方法返回对象为Docket,并将该对象注入到Bean里面
//设置要显示的swagger环境
Profiles profiles = Profiles.of("dev","test");
//获取项目的环境:
//通过environment.acceptsProfiles判断是否处在自己设定的环境中
//如果系统检测到当前环境为dev或者test则flag为true,否则为flase
// boolean flag = environment.;
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("吉吉国王")
//enable 是否开启swagger,如果为false,swagger不能在浏览器中访问
//.enable(false)
.select()
//RequestHandlerSelectors:配置要扫描接口的方式
//basePackage:指定要扫描的包
//any():扫描全部
//none():不扫描
//withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象
//withMethodAnnotation: 扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.hh.swagger.controller"))
//paths():要过滤什么路径
//.paths(PathSelectors.ant("/hh/**"))
.build();
}
/**
* 配置Swagger信息=apiInfo
*/
public ApiInfo apiInfo(){
//作者信息
Contact contact = new Contact("吉吉国王", "https://blog.csdn.net/qq_56265207?spm=1000.2115.3001.5343", "2066176114@qq.com");
return new ApiInfo(
"吉吉国王的SwaggerAPI文档",
"落日很温柔,你也一样",
"v2.0",
"https://blog.csdn.net/qq_56265207?spm=1000.2115.3001.5343",
contact,
"Apache 2.0",
"https://www.apache.org/licenses/LICENSE-2.0",
new ArrayList()
);
}
}
测试:
解释:
配置扫描接口Docket.select()
Docket.apis(RequestHandlerSelectors.basePackage(“com.hh.swagger.controller”))表示只扫描包com.hh.swagger.controller,所以当我们打开网址Swagger UI可以看到只有一个接口信息
enable 配置是否启动swagger
问题:我只希望我的swagger在生产环境中使用,在发布的时候不使用?
进行多配置的方法:
1.第一套环境:在resources下面新建生产环境文件application-dev.properties 并输入以下内容:
server.port=8081
2.第二套环境,在resources下面新建生产环境文件application-pro.properties 并输入以下内容:
server.port=8082
3.在文件SwaggerConfig中按如下设置:
//设置要显示的swagger环境
Profiles profiles = Profiles.of("dev","test");
4.指定当前环境
application.properties中输入以下代码
spring.profiles.active=dev
//指定当前环境为dev
1.只有一个分组:在文件swaggerconfig.java中一定位置加入以下代码
Docket.groupName("吉吉国王")
2.存在多个分组时,一个Docket对象代表一个祖,创建多个对象就会有多个组
//多个组
@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");//第三个组
}
1、创建一个User类
@ApiModel("用户实体类")//给实体类的文档注释
public class User {
@ApiModelProperty("用户名")//给属性的文档注释
public String username;
@ApiModelProperty("密码")
public String password;
}
2、修改controller
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
//只要我们的接口中,返回值存在实体类,它就会被扫描到Swagger中
@PostMapping("/user")
public User user(){
return new User();
}
//Operation接口,不是放在类上,而是放在方法上
@ApiOperation("hello控制类")
@GetMapping("/hello2")
public String hello2(@ApiParam("这是用户名") String username){//@ApiParam("用户名")为参数的注释
return "hello"+username;
}
}
总结: