springboot2.x集成swagger保姆级教程

1.概述

Swagger 是一款用于 API(应用程序接口)设计、开发、文档化及测试的工具框架,可简化 API 全生命周期管理。它通过标准化规范(OpenAPI)定义接口,自动生成交互式文档、客户端 / 服务端代码,支持在线调试,提升前后端协作效率,常见于 RESTful API 开发,核心工具包括 Swagger UI(可视化文档)、Swagger Editor(接口设计)等,让 API 开发更透明、高效。

1.1.以springboot为例,引入swagger依赖
<!-- swagger2 -->
<!-- 生成html文件的依赖 -->
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger2</artifactId>
   <version>2.9.2</version>
   
   <!-- 移除swagger-2.9.2版本的annotations、models,解决参数默认值会报错的bug -->
   <exclusions>
      <exclusion>
         <groupId>io.swagger</groupId>
         <artifactId>swagger-annotations</artifactId>
      </exclusion>
      <exclusion>
         <groupId>io.swagger</groupId>
         <artifactId>swagger-models</artifactId>
      </exclusion>
   </exclusions>
</dependency>

<!-- 提供在线测试的依赖 -->
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger-ui</artifactId>
   <version>2.9.2</version>
</dependency>

<!-- 自定义swagger版本 -->
<dependency>
   <groupId>io.swagger</groupId>
   <artifactId>swagger-annotations</artifactId>
   <version>1.5.21</version>
</dependency>
<dependency>
   <groupId>io.swagger</groupId>
   <artifactId>swagger-models</artifactId>
   <version>1.5.21</version>
</dependency>

1.2.编写swagger配置类
@ComponentScan("cn.test.swaggerdemo.controller") //扫描哪些包,需要生成在线文档
@EnableSwagger2  //必须要的注解
@EnableWebMvc    //必须要的注解
@Configuration
public class*SwaggerConfig {

    @Bean  //返回一个在线API文档,描述信息的配置对象
    public Docket commDucket(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(this.apiInfo());
    }

    public ApiInfo apiInfo(){
        //在线文档的编写人信息
        Contact contact=new Contact("rd","www.1024xh.com","123@qq.com");

        //在线文档的描述信息
        return new ApiInfoBuilder()
                .title("swagger项目接口")
                .description("前台API接口")
                .contact(contact)
                .version("1.0.1")
                .build();

    }
}
1.3.配置在线文档的html文件路径
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    //访问swagger-ui.html
    registry.addResourceHandler("swagger-ui.html")
            .addResourceLocations("classpath:/META-INF/resources/");

    //swagger-ui.html需要的css,js等文件的路径配置
    registry.addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}
2.注解说明
2.1.实体类注解

@ApiModel()用于类 ;表示对类进行说明,用于参数用实体类接收

value–表示对象名

description–描述

都可省略

@ApiModelProperty()用于方法,字段; 表示对model属性的说明或者数据操作更改

value–字段说明

name–重写属性名字

dataType–重写属性类型

required–是否必填

example–举例说明

hidden–隐藏

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.math.BigDecimal;



@ApiModel(value="PmsProduct",description="商品实体类")
@TableName("pms_product")
public class PmsProduct implements Serializable {
    private static final long serialVersionUID = 1L;


    / 主键ID /
    @TableId(value = "product_id")
    @ApiModelProperty(value = "唯一ID")
    private Long productId;

    / 商品封面 /
    @ApiModelProperty(value = "商品封面")
    private String cover;

}
2.2.请求层注解

配置了swagger的信息后,启动工程,访问项目下的 localhost:8080/swagger-ui.html,就可以看到扫描的接口层,所有接口信息,但是默认是没有提示信息的,需要使用一些注解,让在线文档更清晰

//当前模块的描述和详细描述
@Api(value = "StudentController",description = "学生管理页面的功能")  
@RestController
@RequestMapping("/student")
public class StudentController {

    List<Student> studentList=new ArrayList<>();

    public StudentController(){
        studentList.add(new Student(1,"tom"));
        studentList.add(new Student(2,"jack"));
    }


    //此API接口的描述和详细描述
    @ApiOperation(value = "添加功能",notes = "根据传入的学生信息添加到数据库")
   
    //此API需要的参数以及类型
    @ApiImplicitParam(value = "name",paramType = "query")//如果入参是表单参数,paramType改为query
    @RequestMapping(path = "/add",method = RequestMethod.POST)
    public Student addStudent(Student student){
        return student;
    }



    @ApiOperation(value = "删除功能",notes = "根据学生id删除该学生数据")
    @ApiImplicitParam(value = "id值",paramType = "path")//如果入参是url类型,paramType改为path
    @RequestMapping(path = "/del/{id}",method = RequestMethod.DELETE)
    public Student deleteStudent(@PathVariable("id") Integer id){
        Student student=new Student();
        student.setId(id);
        return student;
    }



    @ApiOperation(value = "修改功能",notes = "根据传入的学生信息进行修改")
    @ApiImplicitParam(value = "name",paramType = "body")//如果入参是json类型,paramType改为body
    @RequestMapping(path = "/edit",method = RequestMethod.PUT)
    public Student editStudent(Student student){
        return student;
    }




    @ApiOperation(value = "列表功能",notes = "查看当前模块的所有学生数据")
    @RequestMapping(path = "/list",method = RequestMethod.GET)
    public List<Student> list(){
        return studentList;
    }
}

注解说明:

类上的注解:@Api(tags = “FmsConsumeController”, description = “收支内容管理”)

方法的注解:

@ApiOperation(“添加一条收支记录”)

public CommonResult addConsume(Consume consume) {

方法的注解:

@ApiImplicitParam(value = “id值”,paramType = “query”)

@RequestMapping(path = “/add”, method = RequestMethod.POST)

public CommonResult addConsume(Consume consume) {

swagger兼容spring,会根据形参的字段自动转换成输入框,在页面上供测试

如果接口参数是json类型,在swagger网页调试时,只需在一个参数中填写json格式,把所有参数写到json体中调用即可。

3.页面访问测试

默认访问:http://localhost:8080/swagger-ui.html

4.配置自定义请求头
package com.yuchenboot.admin.system.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;



@ComponentScan("com.test.controller") //扫描哪些包,需要生成在线文档
@EnableSwagger2
@EnableWebMvc
@Configuration
public class Swagger2Configuration {

    @Bean
    public Docket commDucket(){

        //添加header参数token
        ParameterBuilder tokenPar = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<>();
        tokenPar.name("x-access-token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        
        //所有的header参数构建完毕后,放入集合中
        pars.add(tokenPar.build());

        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .build()
                .globalOperationParameters(pars)//将要添加的header集合加入到构建器
                .apiInfo(this.apiInfo());
    }


    public ApiInfo apiInfo(){
        //在线文档的编写人信息
        Contact contact=new Contact("rd","www.1024xh.com","123@qq.com");

        //在线文档的描述信息
        return new ApiInfoBuilder()
                .title("rd-admin")
                .description("API接口文档")
                .version("1.0.0")
                .contact(contact)
                .build();

    }
}
5.配置全局请求头

在项目实际调试中,许多API都需要校验用户的token信息,swagger虽然可以自定义输入请求头,但是每次测试接口都需要输入,显得麻烦。swagger提供了一种全局认证的方式,添加后,每次请求可以自动携带需要的请求头。

5.1.配置全局请求头
package com.yuchenboot.admin.system.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;


@ComponentScan("com.test.controller") //扫描哪些包,需要生成在线文档
@EnableSwagger2
@EnableWebMvc
@Configuration
public class Swagger2Configuration {

    @Bean
    public Docket createDocket(){

        /*添加head头
        ParameterBuilder tokenPar = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<>();
        tokenPar.name("x-access-token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        pars.add(tokenPar.build());*/

        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .build()
                .apiInfo(this.apiInfo())
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());//将要添加的全局请求头放入构造器
                //.globalOperationParameters(pars)
    }



    public ApiInfo apiInfo(){
        //在线文档的编写人信息
        Contact contact=new Contact("rd","www.1024xh.com","123@qq.com");

        //在线文档的描述信息
        return new ApiInfoBuilder()
                .title("rd-admin")
                .description("API接口文档")
                .version("1.0.0")
                .contact(contact)
                .build();

    }

    /**
     * 添加全局请求头
     * @return
     */
    private List<ApiKey> securitySchemes() {
        List<ApiKey> apiKeys = new ArrayList<>();
        apiKeys.add(new ApiKey("x-access-token", "x-access-token", "header"));
        return apiKeys;
    }

    /**
     * 添加全局请求头
     * @return
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.regex("^(?!auth).*$")).build());
        return securityContexts;
    }

    /**
     * 添加全局请求头
     * @return
     */
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("x-access-token", authorizationScopes));
        return securityReferences;
    }
}

5.2.在线测试

随便输入一个参数后,点击认证,swagger会进入上锁状态,之后的每次请求,都会自动携带自己设置的请求头x-access-token,刷新网页后此token会消失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值