微服务-Swagger

121 阅读3分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

Swagger

背景

大后端:前端只管理静态页面htmk,css,后端使用模板引擎

前后端分离

  • 后端:后端控制器,服务层,数据访问层

  • 前端:前端控制层,视图层

    • 前端可以通过伪造后端数据,不依靠后端也能跑起来(前端工程化)
  • 前后端如何交互:通过接口,传递json数据

  • 前后端相对独立,松耦合,可以部署在不同的服务器上

产生的问题:

  • 前后端沟通困难,改变业务麻烦

解决问题

  • 指定完善的schema,实时更新API,降低集成风险
  • 前端测试后端接口:postman
  • 后端提供接口,需要实时更新最新更改

优点

更快捷更方便进行接口API的开发

  • 最流行的API框架
  • 是Resultful风格的API ,文档自动生成:API文档与API定义同步更新
  • 可以直接运行,在线测试API接口
  • 支持多种语言

集合成springboot

入门

1.创建项目,选择web,然后导包

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
       <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-swagger2</artifactId>
           <version>2.9.2</version>
       </dependency>
​
​
       <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
       <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-swagger-ui</artifactId>
           <version>2.9.2</version>
       </dependency>

2.配置Swagger

SwaggerConfig:什么都没写就是默认设置

@Configuration
@EnableSwagger2
public class SwaggerConfig {
​
       
}

3.编写controller和测试

@RestController
public class Controller {
​
   @RequestMapping("/hi")
   public String show(){
       return "hi";
  }
}

访问网页

image.png

配置Swagger

Swagger的bean实例Docket

  • 过滤器 paths(PathSelectors.xxx)
  • 接口扫描 apis(RequestHandlerSelectors.XXX)
  • 开启关闭 enable()
  • 分组 groupName()
  • 文档信息 apiInfo()
@Configuration
@EnableSwagger2
public class SwaggerConfig {
​
   @Bean
   public Docket docket1(){
       return new Docket(DocumentationType.SWAGGER_2).groupName("Y1Y");
  }
   @Bean
   public Docket docket2(){
       return new Docket(DocumentationType.SWAGGER_2).groupName("Y2Y");
  }
​
   @Bean
   public Docket docket(@Qualifier("apiInfo") ApiInfo apiInfo,Environment environment){
       
       Profiles dev = Profiles.of("dev");
       boolean isdev = environment.acceptsProfiles(dev);
​
       return new Docket(DocumentationType.SWAGGER_2)
              .apiInfo(apiInfo)
              .enable(isdev)
              .groupName("YZY")
              .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.swagger.controller"))
              .paths(PathSelectors.any())
              .build();
  }
​
  
​
   @Bean
   public ApiInfo apiInfo(){
​
       Contact contact = new Contact("YZY","http://localhost:8080/swagger-ui.html#/","1061603811@qq.com");
       return new ApiInfo("YZY的API文档",
               "文档描述",
               "1.1",
               "http://localhost:8080/swagger-ui.html#/", contact,
               "Apache 2.0",
               "http://www.apache.org/licenses/LICENSE-2.0",
               new ArrayList());
  }
}

实体类

先要在文档显示实体类,需要在controller返回实体类,

1.创建一个新的controller编写返回实体类的请求

@RestController
@Api(tags = "实体类")
@RequestMapping("/entity")
public class BusEntityController {
​
   @ApiOperation("车辆")
   @PostMapping("/BusCar")
   public BusCar busCar(){
       return new BusCar();
  }
​
   @ApiOperation("司机")
   @PostMapping("/BusDriver")
   public BusDriver busDriver(){
       return new BusDriver();
  }
​
  ......
}
​

2.实体类添加注释

@ApiModel("车站")为实体类添加注释

@@ApiModelProperty("发班总数",example="")为字段添加注释,注意,如果字段为Integer类型,需要添加example条件指定默认值,这边的example="0"只会在Swagger测试中默认,对正常的业务没有影响

@ApiModel("路线")
public class BusRoute implements Serializable {
   private String id;
   private String busStationId;
   @ApiModelProperty("起点")
   private String start;
   @ApiModelProperty(value = "每日班次",example = "0")
   private Integer time;

返回的实体类就会显示在models上,controller中部没有回的实体类不会出现在models上

image.png

注释

@Api(tags="司机列表")为controller类加注释

@ApiOperation("查询")为controller的方法加注释

@RestController
@Api(value="车辆controller",tags={"车辆列表"})
@RequestMapping("/car")
public class BusCarController {
​
   @ApiOperation("查询全部")
   @PostMapping("/selectAll")
   public Map<String,Object> selectAll(){
      
  }


20201011184227

测试

1589187242370

image.png

总结作用

1.接口文档的设置(配置文件)

2.在线测试

在正式发布需要关闭为了安全和效率