前后端分离缺陷

了解Swagger之前,需要先知道什么是前后端分离

  • 现在的时代

    • SpringBoot + VUE
  • 以前的时代
    • SSM + JSP模板引擎====>后端程序员
  • 前后端分离时代
    • 通过相关的API接口进行交互
    • 前后端相对独立,松耦合
    • 前后端可以分别部署在不同的服务器上
    • 伪造后端交互数据,json数据已经存在,不需要后端传入json数据了,前端工程已经可以运行
    • 后端:后端控制层 + 服务层 + 数据访问层
    • 前端:前端控制层 + 视图层
    • 前后端如何交互?
  • 但这样会产生新问题
    • 前后端集成联调,前端和后端开发人员无法做到及时协商,尽早解决问题,就会导致项目延期
  • 解决方案:
    • 前端测试后端:postMan
    • 后端提供接口,需要实时更新最新的消息和改动
    • 首先指定schema[计划大纲],团队实时更新最新的API,可以降低集成的风险;
    • 早些年:指定world计划文档
    • 前后端分离:

Swagger简介

Swagger官网

  • 号称世界上最流行的API框架
  • RestFul API文档在线生成工具--->>>==API文档与API同步更新==
  • 可以直接运行,可以在线测试API接口
  • 支持多种语言:(Java,PHP......)

官网界面

使用SpringBoot集成Swagger

  • 创建SpringBoot-Web项目,导入相关依赖

注意事项:

  • 在项目中使用Swagger需要SpringBox
  • swagger2
  • swaggerui
        <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>
  • 创建hello程序

扩展,一个hello程序有两个请求,一个是SpringBoot项目默认的/error

image-20200611133103333
@RestControllerpublic class HelloController {    /**     * 测试Controller     *     * @return     */    @GetMapping("/hello")    public String hello() {        return "你好呀!!!Swagger";    }}
  • 配置Swagger,新建SwaggerConfig
@Configuration // 标识配置类@EnableSwagger2 // 开启Swaggerpublic class SwaggerConfig {

}
  • 测试运行

唯一地址:http://localhost:8080/swagger-ui.html

首页信息

配置Swagger信息

  • 修改SwaagerConfig
package com.mobai.swagger.config;

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Contact;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;

/** * Software:IntelliJ IDEA 2020.1 x64 * Author: MoBai·杰 * Date: 2020/6/11 13:33 * ClassName:SwaggerConfig * 类描述:Swagger配置类 */@Configuration // 标识配置类@EnableSwagger2 // 开启Swaggerpublic class SwaggerConfig {

    /**     * 配置了Swagger的Docket的Bean实例     *     * @return     */    @Bean    public Docket docket() {        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());    }

    /**     * 配置Swagger信息     *     * @return     */    private ApiInfo apiInfo() {        // 配置作者信息        Contact contact = new Contact("墨白",                "https://www.mobaijun.com",                "mobaijun8@163.com");        // 配置API文档标题        return new ApiInfo("框架师Api",                // API文档描述                "Api Documentation",                // API版本号                "1.0",                // 配置URL(公司官网/blog地址)                "https://www.mobaijun.com",                // 作者信息                contact,                // 以下内容默认即可                "Apache 2.0",                "http://www.apache.org/licenses/LICENSE-2.0",                new ArrayList());    }

}

Swagger配置扫描接口

Docket.select();

  • SawggerConfig配置类完善配置扫描接口的参数
 /**  * 配置了Swagger的Docket的Bean实例  *  * @return  */ @Bean public Docket docket() {     return new Docket(DocumentationType.SWAGGER_2)             .apiInfo(apiInfo())             // 配置扫描接口             .select()             /*              *RequestHandlerSelectors,配置要扫描接口的方式              * 参数说明:              * basePackage:基于包扫描              * class:基于类扫描              * any():扫描全部              * none():全部都不扫描              * withMethodAnnotation:通过方法的注解扫描              * // withMethodAnnotation(GetMapping.class))              * withClassAnnotation:通过类的注解扫描              */             .apis(RequestHandlerSelectors.basePackage("com.mobai.swagger.controller"))             // .paths()过滤,不扫描哪些接口             .paths(PathSelectors.any())             .build(); }
  • 配置Swagger启动
/** * 配置了Swagger的Docket的Bean实例 * * @return */@Beanpublic Docket docket() {    return new Docket(DocumentationType.SWAGGER_2)            .apiInfo(apiInfo())            // 配置Swagger是否启动,默认:true            .enable(false)            // 配置扫描接口            .select()            .apis(RequestHandlerSelectors.basePackage("com.mobai.swagger.controller"))            .paths(PathSelectors.any())            .build();}

小测试:如果有一个需求,需要你判断在生成环境中使用,在发布的时候不使用

  • 开发思路

    • 先判断.enable()是不是等于false
    • 注入Enable(flag)
  • 实现,添加application-dev.properties生产环境配置和application-pro.properties发布环境配置

  • 默认application.properties环境配置添加

# 开启profiles.active监听,dev测试环境,pro发布环境spring.profiles.active=dev
  • 生产环境修改端口号
server.port=8081
  • 发布环境修改端口号
server.port=8082
  • SwaggerConfig配置类判断当前环境
/** * 配置了Swagger的Docket的Bean实例 * * @return */@Beanpublic 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(flag)            // 配置扫描接口            .select()            .apis(RequestHandlerSelectors.basePackage("com.mobai.swagger.controller"))            .paths(PathSelectors.any())            .build();}

配置API文档的分组

  • 配置多个组,添加.groupName()
   /**     * 配置了Swagger的Docket的Bean实例     *     * @return     */    @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())                // 配置分组                .groupName("墨白小组")                // 监听自己设置的环境                .enable(flag)                // 配置扫描接口                .select()                .apis(RequestHandlerSelectors.basePackage("com.mobai.swagger.controller"))                .paths(PathSelectors.any())                .build();}
  • 效果

image-20200611145705157
  • 配置多个组
@Configuration // 标识配置类@EnableSwagger2 // 开启Swaggerpublic class SwaggerConfig {

    /**     * 添加A组     * 每个组各司其职     *     * @return     */    @Bean    public Docket docket1() {        return new Docket(DocumentationType.SWAGGER_2)                .groupName("A");    }

    /**     * 添加B组     *     * @return     */    @Bean    public Docket docket2() {        return new Docket(DocumentationType.SWAGGER_2)                .groupName("B");    }

    /**     * 添加C组     *     * @return     */    @Bean    public Docket docket3() {        return new Docket(DocumentationType.SWAGGER_2)                .groupName("C");    }

    /**     * 配置了Swagger的Docket的Bean实例     *     * @return     */    @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())                // 配置分组                .groupName("墨白小组")                // 监听自己设置的环境                .enable(flag)                // 配置扫描接口                .select()                .apis(RequestHandlerSelectors.basePackage("com.mobai.swagger.controller"))                .paths(PathSelectors.any())                .build();    }
  • 效果

image-20200611150302823
  • 实体类配置
@ApiModel("用户实体类") // 添加注释public class User {    // 添加注释    @ApiModelProperty("年龄")    private Integer age;

    @ApiModelProperty("姓名")    private String name;

    @ApiModelProperty("账号")    private String username;

    @ApiModelProperty("密码")    private String password;

    public Integer getAge() {        return age;    }

    public void setAge(Integer age) {        this.age = age;    }

    public String getName() {        return name;    }

    public void setName(String name) {        this.name = name;    }

    public String getUsername() {        return username;    }

    public void setUsername(String username) {        this.username = username;    }

    public String getPassword() {        return password;    }

    public void setPassword(String password) {        this.password = password;    }}
  • 效果

效果图
  • Swagger常用注解

    • @ApiModel("注释"):实体类添加注释
    • @ApiModelProperty("注释"):给实体类属性添加注释
    • @ApiOperation("注释")给接口(Controller)方法添加注释,放在方法上
    • @ApiParam("")给方法的参数添加注释
    • @Api("")给类添加注释
  • controller

package com.mobai.swagger.controller;

import com.mobai.swagger.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.RestController;

/** * Software:IntelliJ IDEA 2020.1 x64 * Author: MoBai·杰 * Date: 2020/6/11 13:25 * ClassName:HelloController * 类描述: 测试类 */@ApiOperation("")@RestControllerpublic class HelloController {    /**     * 测试Controller     *     * @return     */    @GetMapping("/hello")    public String hello() {        return "你好呀!!!Swagger";    }

    /**     * 只要我们的接口中,返回值存在实体类,Swagger就会扫描到     *     * @return     */    @PostMapping("/user")    public User user() {        return new User();    }

    @ApiOperation("Post测试类")    @PostMapping(value = "/post")    public User post(@ApiParam("用户对象") User user) {        return user;    }}
  • 总结

    • 添加@Configuration注解,标识配置类
    • 添加@EnableSwagger2注解开启Swagger
    • Swagger2
    • Swagger-ui
    • 创建SpringBoot项目,导入Swagger依赖
    • 创建Swagger配置类
    • 配置SwaggerDocketBean实例
    • 配置Swagger信息
  • 我们可以通过Swagger给一些比较难理解的属性或者接口,增加注释信息

  • 接口文档实时更新

  • 可以在线测试

  • Swagger是一个优秀的工具,几乎所有的大公司都在用

  • 需要注意:正式发布的时候,关闭swagger!!!出于安全考虑,而且节省运行内存!

感谢阅读,如果有帮助到你,请转发,点击再看,这是我分享的动力,感谢

  • IntelliJ IDEA 插件,用了上头的那种

  • 面8-15K可能会遇到的面试题

  • 精选SpringCloud微服务实战项目[视频,源码]

  • 如何利用码云搭建一个自己的图床?

swagger 修改dto注解_一文搞懂Swagger,让你明白用了Swagger的好处!!!相关推荐

  1. python爬虫 django搜索修改更新数据_一文搞懂Django数据库查询操作

    本文略长,读完约需十分钟.当做复习笔记效果更佳. 查询操作: 数据查询是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时 ...

  2. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码

    提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...

  3. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  4. pythonxpath定位_一文搞懂 XPath 定位

    一文搞懂XPath 定位 XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历. XPath定位在爬虫和自动化测试中 ...

  5. swagger 修改dto注解_Web服务开发:Spring集成Swagger,3步自动生成API文档

    目录: 1,Spring Boot集成Swagger 2,Swagger接口文档页面 3,常见问题和解决方法 在Sping开发REST接口服务时,API文档是不可缺少的一个重要部分.Swagger框架 ...

  6. swagger 修改dto注解_Swagger 详解

    Swagger快速理解 Swagger:The Best APIs are Built with Swagger Tools .Swagger可以定义一个标准的RESTful风格的API,与语言无关, ...

  7. swagger 修改dto注解_Swagger介绍及使用

    Swagger介绍及使用 导语: 相信无论是前端还是后端开发,都或多或少地被接口文档折磨过.前端经常抱怨后端给的接口文档与实际情况不一致.后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新.其 ...

  8. java8 lambda 视频_一文搞懂Java8 Lambda表达式(附带视频教程)

    Lambda表达式介绍 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.通过Lambda表达式,可以替代我们以前经常写的匿名内部类来实现接口.Lambda表达式本质是一个 ...

  9. python数组类型_一文搞懂Python中的所有数组数据类型

    关于我 编程界的一名小小程序猿,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. 联系:hylinux1024@gmail ...

最新文章

  1. python在会计中的应用-Python会计数据分析
  2. LeetCode Largest Number
  3. NOIP 2011 Day2
  4. python字典转dataframe_python DataFrame转dict字典过程详解
  5. Logistics模型预测银行贷款违约
  6. 苹果助手一键安装_再见!国内经典的iOS越狱助手,正式宣布下线
  7. VB写的随机点名器代码
  8. 服务器怎么做好安全防护措施
  9. 互联网日报 | 360企业安全更名“政企安全”;B站获欢喜传媒独家外部播放权;银联发布首款数字银行卡...
  10. redis设置用户名和密码
  11. Centos挂载iscsi存储(浪潮存储)
  12. 【报告分享】汽车数字营销新度量衡-懂车帝(附下载)
  13. httprunner3.x使用过程中遇到的问题
  14. Javascript静态变量与实例变量
  15. vue项目如何区分开发、生产和测试环境
  16. 利用房价预测推导梯度下降
  17. 关于SYSTICK延时函数的两个小疑问
  18. [解决方案] Mendelay无法打开pdf文档:显示 unable to open this file
  19. ssi 指令 php,SSI使用详解(一)_PHP教程
  20. 女程序员转测试 欢迎留言讨论

热门文章

  1. Spark机器学习库MLib分类和回归文档V1.4.1(翻译)
  2. GraphX:基于Spark的弹性分布式图计算系统
  3. 在Myeclipse中配置 jboss 图解
  4. android适配性报告,关于Android的多种屏幕适配
  5. java nextline_Java写一个学生管理系统
  6. 台式计算机光标时不时跳动,解决方案:如何解决联想笔记本触摸板上的光标跳动?...
  7. codeblocks哪个字体最舒服_如果给你一百万让你放弃一种美食永远不吃,你会放弃哪个?...
  8. android 不同项目代码合并在一块,android - 是否可以将两个(正在积极开发中的)Android应用程序模块合并到同一个Android Studio项目中? - 堆栈内存溢出...
  9. python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
  10. 新华三的背景_星际联盟一行莅临新华三集团杭州总部,展望分布式存储广阔发展空间...