学习目标:

  • 了解Swagger的作用和概念
  • 了解前后端分离
  • 在springboot中集成Swagger
  • Swagger简介:

    前后端分离:

    Vue+springboot
    Vue是有双向绑定的 他的前端视图都是用js渲染的,我们只需要通过后端吧前端的js页面数据生成就行了

    后端时代:

    前端只用管理静态页面;html,js,css==》后端。使用模板引擎 JSP =》后端是主力

    前后端分离时代:

    前端:

    前端控制层(vue双向绑定,通过data渲染), 视图层(views)【在公司前端团队搞】
    1.伪造后端数据 ,在js文件里面放入JSON数据。数据已经存在了,不需要后端,前端的工程也能跑起来,数据请求的是前端本地的js,在真实上线数据应该请求的后端接口 如前端js文件数据留有
    {
    “code” :0,
    “msg” :””,
    “data” : {“username” : “青江”,
    “sex” : “男”,
    “role” : 1}
    }

后端:

后端控制层(Controller),服务层(Service),数据访问层(Dao)【在公司后端团队搞】
进行交互的时候 后台提供的API返回的也应该是一模一样的数据
{
“code” :0,
“msg” :””,
“data” : {“username” : “青江”,
“sex” : “男”,
“role” : 1}
}

前后端如何交互?

前端让后端提供API接口 并且跟他说好这个接口返回的json数据是什么格式 ,后端说我知道了 我马上就去按照你的要求写一个接口,并返回你要求的json数据

前后端相对独立

前后端相对独立,松耦合度 ,甚至他们两个可以部署在不同的服务器上 如前端8080端口 后端9090端口

产生问题:

前后端集成联调,前端和后端人员无法做到及时协商,来尽早解决。如果前端临时加需求,后端要写大量的代码,最终导致问题集中爆发导致工程延期

解决方案:

  • 首先制定schema【计划的提纲】,实时更新最新的API,降低集成的风险;
  • 早些年:制定world计划文档;
  • 前后端分离:

    1. 需要一种后端更新了,前端需要生成一个界面来使用我的API,前端还可以测试我的API是否可以链接成功<br /> 1.前端需要测试后端的接口 postman工具可以来测试<br /> 2.后端提供接口,需要实时更新最新的消息及改动

    Swagger

  • 号称世界上最流行的Api框架;

  • RestFul Api 文档在线自动生成工具 =》Api文档与Api定义同步更新
  • 直接允许,可以在线测试api接口;
  • 支持各种的语言:(java,php…)

    Swagger官网

    https://swagger.io/
    使用Swagger开源和专业工具集简化用户、团队和企业的API开发。了解Swagger如何帮助您按比例设计和记录API。

    在项目中使用Swagger需要spring box;

  • Swagger2

  • ui

    在springBoot中集成Swagger

    1.新建一个springboot-web项目

    Swagger-text.zip

    2.导入相关依赖分别是

    image.png
    image.png
    1. <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    2. <dependency>
    3. <groupId>io.springfox</groupId>
    4. <artifactId>springfox-swagger-ui</artifactId>
    5. <version>2.9.2</version>
    6. </dependency>
    7. <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    8. <dependency>
    9. <groupId>io.springfox</groupId>
    10. <artifactId>springfox-swagger2</artifactId>
    11. <version>2.9.2</version>
    12. </dependency>

3.编写一个hello工程

image.png
image.png

4.配置Swagger==>Config

@Configuration
只要加了就会配置到配置里面
image.png
加入@EnableSwagger2注解就会开启Swagger2

5.我们访问:

http://localhost:8080/swagger-ui.html
image.png
image.png微信图片_20210626131414.png

配置Swagger基本信息

Swagger 的 bean 实例Docket

配置基本信息

  1. package com.example.swaggertext.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import springfox.documentation.service.ApiInfo;
  5. import springfox.documentation.service.Contact;
  6. import springfox.documentation.spi.DocumentationType;
  7. import springfox.documentation.spring.web.plugins.Docket;
  8. import springfox.documentation.swagger2.annotations.EnableSwagger2;
  9. import java.util.ArrayList;
  10. @Configuration
  11. @EnableSwagger2
  12. //开启Swagger2
  13. public class SwaggerConfig {
  14. //作者信息
  15. public static final Contact DEFAULT_CONTACT = new Contact("", "", "");
  16. //配置了Swagger 的Docket的bean实例
  17. @Bean
  18. public Docket docket(){
  19. return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
  20. }
  21. //配置Swagger信息=apiInfo
  22. private ApiInfo apiInfo(){
  23. return new ApiInfo(
  24. "Api Documentation",
  25. "Api Documentation",
  26. "1.0",
  27. "urn:tos",
  28. DEFAULT_CONTACT,
  29. "Apache 2.0",
  30. "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList());
  31. }
  32. }

Swagger配置扫描接口以及开关

默认的扫描接口是所有的扫描都写了
select()方法可以自定义扫描接口

  1. @Bean
  2. public Docket docket(){
  3. return new Docket(DocumentationType.SWAGGER_2)
  4. .apiInfo(apiInfo())
  5. .select()
  6. //RequestHandlerSelectors配置要扫描接口的方式
  7. .apis(RequestHandlerSelectors.basePackage("com.example.swaggertext.Controller"))
  8. //any() 扫描全部的接口
  9. //.apis(RequestHandlerSelectors.any())
  10. //none()默认不扫描
  11. //.apis(RequestHandlerSelectors.none())
  12. //withClassAnnotation扫描类上的注解 参数只能是 注解的.class
  13. //.apis(RequestHandlerSelectors.withClassAnnotation(Generated.class))
  14. // withMethodAnnotation 扫描方法上的注解
  15. //.apis(RequestHandlerSelectors.withMethodAnnotation(Generated.class))
  16. //.paths 过滤器 我首先扫描Controller包里面的东西 使用paths方法过滤只要 helloController里面的接口
  17. .paths(PathSelectors.ant("/helloController/**"))
  18. .build();

配置是否启动Swagger


  1. public Docket docket(){
  2. return new Docket(DocumentationType.SWAGGER_2)
  3. .apiInfo(apiInfo())
  4. //enable配置是否启动Swagger 如果未false 则 sweeger不能在浏览器中访问
  5. .enable(false);

我只希望我的swagger只在生产环境中使用 在发布的时候不使用

  • 判断是不是生产环境 flag = false
  • 将flag赋值给enable就可以.enable(flag)

    如何判断我们的端口号是哪个?

  • image.png

  • dev是我们的测试环境端口号为8989,生产环境是我们的pro端口号为9999
  • 在application.properties中spring.profiles.active=dev 来激活我们的测试端口
  • 在代码里面获取环境:

    1. //看一下项目到底是测试的,生产的,还是默认的
    2. public Docket docket(Environment environment){
    3. //设置要显示的Swagger环境
    4. Profiles profiles = Profiles.of("dev");
    5. //通过environment.acceptsProfiles(profiles); 判断是否处在自己设定的环境当中 如果是“dev”
    6. //flag就是ture 不是就是false
    7. boolean flag = environment.acceptsProfiles(profiles);

    配置API文档分组以及接口注释

  • 我们首先到默认端口 8080上

  • 我们现在有ABC三个人员协同开发 让他们每个人分别负责 A B C三个模块
  • 新建ABC三个分组

    1. @Bean
    2. public Docket docket1(){
    3. return new Docket(DocumentationType.SWAGGER_2).groupName("A");
    4. }
    5. @Bean
    6. public Docket docket2(){
    7. return new Docket(DocumentationType.SWAGGER_2).groupName("B");
    8. }
    9. @Bean
    10. public Docket docket3(){
    11. return new Docket(DocumentationType.SWAGGER_2).groupName("C");
    12. }

    image.png

  • 我们新建一个实体类User ```java package com.example.swaggertext.pojo;

public class User { public String username; public String password; }

  1. 在写一个UserAPI
  2. ```java
  3. //只要我们的接口中,返回值中存在实体类 他就会被扫描到Swagger中
  4. @PostMapping("/user")
  5. public User user(){
  6. return new User();
  7. }

image.png
可以看到Controller 和model都有user

  • 我们还可以给生成的文档加注释 ```java @ApiModel(“用户实体类”) public class User { @ApiModelProperty(“用户名”) public String username; @ApiModelProperty(“密码”) public String password; }
  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2819307/1624774778793-37fd6e96-c3f7-44d0-9205-d97b89f29fc5.png#align=left&display=inline&height=208&margin=%5Bobject%20Object%5D&name=image.png&originHeight=416&originWidth=1406&size=23994&status=done&style=none&width=703)
  2. - 还可以给API加注释
  3. 我们新建一个API hello2
  4. ```java
  5. @ApiOperation("hello控制类")
  6. @PostMapping(value = "/hello2")
  7. public String hello2(@ApiParam("用户名") @RequestBody String username ){
  8. System.out.println(username);
  9. return "hello"+username;
  10. }

image.png

swagger的测试功能

微信图片_20210627144713.png
点击Try it out
image.png
我们给后端发送请求 字符串
{“username”:”你好”}
“username”:”你好”
“你好”
image.png
image.png
我们新建一个API接口 hello3 传入User

  1. @ApiOperation("hello控制类")
  2. @PostMapping(value = "/hello3")
  3. public User hello3(@ApiParam("用户名") @RequestBody User user ){
  4. System.out.println(user.username);
  5. System.out.println(user.password);
  6. return user;
  7. }
  8. }

我们进入Swagger hello3的界面
image.png
点击Try it out 传值
将password “小王”
username:“123456”
发送给后端

image.png
在后端控制台上打印username 和password的值并且返回给前端user对象image.png
可以看出前端response的值为user对象
image.png
code返回200为成功

我们现在测试一下500的错误

在后端中写入 int i=5/0;

  1. public User hello3(@ApiParam("用户名") @RequestBody User user ){
  2. int i = 5/0;
  3. System.out.println(user.username);
  4. System.out.println(user.password);
  5. return user;
  6. }

image.png
我们可以看到他报了500的错误 而且错误很清楚

总结

1.我们可以使Swagger给一些比较难理解的属性或者接口,增加注释信息,
2.接口文档实时更新
3.可以在线测试