【swagger2】开发api文档

news2024/12/26 23:11:23

文章目录

    • 一、swagger2 简介
      • 背景
      • Open API ???
      • swagger2的作用
      • swagger2常用工具组件:
    • 二、Springfox
    • 三、springBoot使用swagger2(简单示例)
    • 四、Swagger-UI使用
    • 五、配置文件
      • 1、配置类:给docket上下文配置api描述信息
      • 2、配置类:扫描包
      • 3、自定义注解设置不需要生成接口文档的方法
        • ▶@Target-描述当前的注解可以定义在什么资源上
        • ▶@Retention-当前注解在什么时候有效
        • ▶示例
      • 4、配置路径范围配置paths()
    • 六、Swagger2常用注解
      • 常用注解:
      • @Api
      • @ApiOperation
      • @ApiParam
      • @ApiImplicitParam-s
      • @ApiModel、@ApiModelProperty

一、swagger2 简介

官网:https://swagger.io/

背景

我们后端在编写项目的时候,往往都会在代码上加上注释,方便自己以后的修改和维护,和方便别人的理解。但是对对前后端分离的项目,前端人员写前端代码,后端人员编写后端的代码。这样的话当前端需要调用我们后端的接口的时候,就会来找我们询问参数以及请求的接口路径。如果每次都来问的话就会很繁琐。所以我们要讲我们自己编写的代码,生成一个api文档,里面描述了我们各种接口调用规则,我们只需要将这个api文档交给前端人员即可。前端人员就可以根据我们提供的文档获取到他们需要调用的接口路径以及参数信息。

Open API ???

Open API规范(OpenAPI Specification)以前叫做Swagger规范是RESTAPI的API描述格式。
Open API文件允许描述整个API,包括:

  • 每个访问地址的类型。POST 或GET。I
  • 每个操作的参数。包括输入输出参数。
  • ·认证方法。
  • 连接信息,声明,使用团队和其他信息。

Open API规范可以使用YAML或JSON格式进行编写。这样更利于我们和机器进行阅读。

swagger2的作用

swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务
作用:

  • 接口的文档在线自动生成
  • 功能测试

用白话说就是:后端人员写完代码后,不想写开发文档,就嵌用api注解,代码启动,访问固定的路径: ip+端口+路径地址来访问代码。

swagger2常用工具组件:

1、Swagger Editor:基于浏览器编辑器,可以在里面编写Open API规范。类似
Markdown具有实时预览描述文件的功能。(还要自己写,需要会json或者yaml)
2、Swagger UI:将Open API规范呈现为交互式API文档。用可视化U展示描述文件。(注解)
3、Swagger Codegen:将OpenAPI规范生成为服务器存根和客户端库。通过Swagger
Codegen可以将描述文件生成html格式和 cwiki形式的接口文档;同时也可以生成多种
言语的客户端和服务端代码。
4、Swagger Hub:集成了上面所有项月的各个功能,你可以以项目和版本为单位,将你
的描述文件上传到Swagger Hub中。在Swagger Hub中可以完成上面项目的所有工作,
需要注册账号,分免费版和收费版。

二、Springfox

使用Swagger时如果碰见版本更新或迭代时,只需要更改Swagger的描述文件即可。
但是在频繁的更新项目版本时很多开发人员认为即使修改描述文件( yml或json )也是一种负担,就直接改代码,这样开发文档的作用就没意义了。

作用:
Spring-fox是根据代码生成接口文档,所以正常的进行更新项目版本,修改代码即可,
而不需要跟随修改描述文件。

Spring-fox利用自身AOP 特性,把 Swagger集成进来,底层还是Swagger。但是使
用起来确方便很多。所以实际开发中使用springfox。
官网:http://springfox.github.io/springfox/
源码:https://github.com/springfox/springfox

三、springBoot使用swagger2(简单示例)

▶导入依赖:pom.xml,自己库里的其他版本都行

 <!--swagger2的依赖-->
 <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger-ui</artifactId>
     <version>2.9.2</version>
 </dependency>
 <!--视图逻辑swagger-ui-->
 <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>2.9.2</version>
     <scope>compile</scope>
 </dependency>

▶先写一个controller,里面有三种请求方法,自定义、get、post

@RestController//方法中所有的返回值都相当于加了一个@ResponseBody
@RequestMapping("/user")
public class MyController {

    @PostMapping("/getUserById")//post请求
    public String post(Integer id){
        return "post:根据id获取User";
    }

    @GetMapping("/getUsers")//get请求
    public String get(){
        return "get:获取所有的User";
    }

    @RequestMapping("/req")//这种请求方式是不限制请求方式的,任意请求方式都可以访问
    public String req(String m){
        return "request!!!";
    }
}

▶在启动类上注解@EnableSwagger2

@EnableSwagger2
springfox提供的注解,代表swagger2相关技术开启,会扫描当前类所在包,及子包中所有的类型中的注解,

▶运行启动类,访问路径:http://localhost:8080/swagger-ui.html
在这里插入图片描述
在这里插入图片描述

访问swagger-ui.html后可以在页面中着到所有需要生成接口文档的控制器名称

  • basic-error-controller中:是springBoot内部的,关于错误提示的controller。
  • MyController:自己写的。其中有get和post的请求,还有一个没有限制请求方式的方法。
  • ……

四、Swagger-UI使用

【扫描我们编写的所有的控制器,扫描约束,显示在视图中(上面截图)】

@GetMapping("/get")
==这两个方法是等价的==
@RequestMapping(method = {RequestMethod. GET})

Swagger-UI:

  • 显示控制器
  • 显示控制器中的请求方法(路径地址的处理)、参数、名字等
  • 简单测试请求,以及返回的响应结果描述
    在这里插入图片描述

五、配置文件

上面提到过在视图中有些东西可以修改,与本项目的内容无关,就需要通过配置类来实现修改
在这里插入图片描述

1、配置类:给docket上下文配置api描述信息

@Configuration
public class SwaggerConfig1 {
    /**
     * 创建Docket类型的对象。并使用spring容器管理。
     * Docket是Swagger中的全局配置对象。
     * @return docket
     */
    @Bean
    public Docket createRestApi() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2);

        //API帮助文档的描述信息
        ApiInfo apiInfo = new ApiInfoBuilder()
                .contact(             //配置swagger文档主体内容
                    new Contact(
                        "简单示例Swagger的开发文档",   //是文档的发布者名称
                        "http://www/xxxx",      //是文档发布者的网站地址。企业网站
                        "admin@bjsxt.com")       //文档发布者的电子邮箱
                )
                .title("swagger文档标题")
                .description("swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,开发帮助文档")
                .version("1.1")
                .build();
        docket.apiInfo(apiInfo);

        return docket;
    }
}

文档运行路径:http://localhost:8080/swagger-ui.html,对比上张图,观察上下文配置api描述信息都是修改的文档的哪个地方。
在这里插入图片描述

2、配置类:扫描包

   docket.select()   		//获取Docket中的选择器。返回ApiSelectorBuilder。构建选择器的。如:扫描什么包的注解
         .apis(RequestHandlerSelectors.basePackage("com.wxy.springboot_swagger.controller"));  //规则,设定扫描哪个包(包含子包)

3、自定义注解设置不需要生成接口文档的方法

▶@Target-描述当前的注解可以定义在什么资源上

属性value定义具体的资源,常用:

  • ElementType.METHOD可以定义在方法上
  • EIementType.TYPE可以定义在类型上
  • ElementType.FIELD可以定义在属性上
  • ElementType.PARAMETER可以定义在方法参数上
  • ……

▶@Retention-当前注解在什么时候有效

属性value-定义具体的生效标记三个:

  • RetentionPolicy.RUNTIME-运行时有效(常用)
  • RetentionPolicy.SOURCE一源码中有效
  • RetentionPolicy.CLASS-字节码有效

▶示例

1.写一个自定义注解类

/**
 * @interface 代表当前是一个注解类
 */
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationSwagger {
    //自定义注解中的属性。相当于@MyAnnotationSwagger(value="")
    String value() default "";
}

2.自定义注解的使用:实现controller中“req()”方法不在文档视图中显示
要在controller中req()的方法上添加注解@MyAnnotationSwagger
在这里插入图片描述
在配置类中设置规则匹配器(内部是静态方法)

docket = docket
        .select()   //获取Docket中的选择器。返回ApiSelectorBuilder。构建选择器的。如:扫描什么包的注解
        //.apis(RequestHandlerSelectors.basePackage("com.wxy.springboot_swagger2.controller"))  //规则,设定扫描哪个包(包含子包)
        .apis(Predicates.not(  //取反:false->true true->false
                RequestHandlerSelectors.withMethodAnnotation(  //withMethodAnnotation:当方法上有注解时返回true
                        MyAnnotationSwagger.class))         //方法有什么注解的时候返回true
                ).build();  //重新构建Docket对象

测试:只有get和post两个方法了
在这里插入图片描述
Predicates.and()
在这里插入图片描述

4、配置路径范围配置paths()

.paths(
      PathSelectors.regex("/swagger/.*") //使用正则表达式,约束生成API文档的路径地址。
      //控制器访问路径以swagger开头的。@RequestMapping("/swagger")
)

在这里插入图片描述

.paths(
	Predicates.or( //多个规则符合任意一个即可通过。
		PathSelectors.regex(pathRegex:"/swagger/.*"),
		PathSelectors.regex(pathRegex:"/swagger2/.*"),
		PathSelectors.regex(pathRegex:"/.*")
	)
)

六、Swagger2常用注解

常用注解:

swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。

  • @Api:修饰整个类,描述Controller的作用。
    • tags:给当前类型定义别名,可以有多个。定义几个别名,在ui视图中就显示几个控制器访问菜单。
    • description:定义描述
  • @ApiOperation:描述一个类的一个方法,或者说一个接口
  • @ApiParam:单个参数描述
  • @ApiModel:描述实体类型,用对象来接收参数
  • @ApiModelProperty:用对象接收参数时,描述对象的一个字段
  • @ApiImplicitParam:在方法上描述方法的一个请求参数
  • @ApiImplicitParams:多个请求参数
  • @ApiIgnore:忽略当前注解描述的方法或类型,不生成api帮助文档

@Api

@RestController
@RequestMapping("/user")
@Api(tags = {"MyController","Swagger测试控制器"},description = "测试API类型描述信息")
public class MyController {
	……
}

在这里插入图片描述

@ApiOperation

    @PostMapping("/getUserById")//post请求
    @ApiOperation(value = "post方法,执行新增操作", notes = "Swagger学习使用-处理POST请求的方法")
    public String post(Integer id){
        return "post:根据id获取User";
    }

在这里插入图片描述

@ApiParam

在这里插入图片描述
在这里插入图片描述

@ApiImplicitParam-s

@GetMapping("/test")
@ApiImplicitParam(name = "m", value = "m参数描述",required = false, paramType = "字符串",dataType = "明值对")
public String test(String m,String n){
    return "request!!!";
}

在这里插入图片描述

@ApiImplicitParams(value = {
            @ApiImplicitParam(name = "m", value = "m参数描述",required = false, paramType = "字符串",dataType = "明值对"),
            @ApiImplicitParam(name = "n", value = "n参数描述",required = true, paramType = "字符串",dataType = "明值对")

    })

@ApiModel、@ApiModelProperty

/**
 * ApiModel 描述一个实体类型。这个实体类型如果成为任何一个生成api帮助文档方法的
 * 返回值类型的时候,此注解被解析。
 */
@ApiModel(value = "自定义实体类",description = "MyEntity存储用户数据")
public class MyEntity implements Serializable {
    @ApiModelProperty(value = "主键",name = "主键(id)",required = false,example = "1",hidden = false)
    private String id;
    @ApiModelProperty(value = "姓名",name = "姓名(name)",required = true,example = "张三",hidden = false)
    private String name;
    @ApiModelProperty(value = "密码",name = "密码(password)",required = true,example = "123456",hidden = false)
    private String password;

    public MyEntity(){}

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyEntity myEntity = (MyEntity) o;
        return Objects.equals(id, myEntity.id) && Objects.equals(name, myEntity.name) && Objects.equals(password, myEntity.password);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, password);
    }
}

返回类型是实体类类型:

   @RequestMapping("/testEntity")
    public MyEntity testEntity(){
        return new MyEntity();
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

净现值、投资回收期例题讲解

净现值概念净现值&#xff08;NPV&#xff09;&#xff1a;指今后某年的Y元相当于今年的X元。需要关注两个概念&#xff1a;利率&#xff1a;利率是指借款、存入或借入金额&#xff08;称为本金总额&#xff09;中每个期间到期的利息金额与票面价值的比率。贴现率&#xff08;D…

微软Bing的AI人工只能对话体验名额申请教程

微软Bing 免费体验名额申请教程流程ChatGPT这东西可太过火了。国外国内&#xff0c;圈里圈外都是人声鼎沸。微软&#xff0c;谷歌&#xff0c;百度这些大佬纷纷出手。连看个同花顺都有GPT概念了&#xff0c;搞技术&#xff0c;做生意的看来都盯上了 流程 下面就讲一下如何申…

Python3遍历文件夹提取关键字及其附近字符

要求&#xff1a; 1&#xff0c;遍历文件夹下所有的.xml文件 2&#xff0c;从.xml文件中提取关键字以及左右十个字符 3&#xff0c;输出到excel 一&#xff1a;遍历文件夹找到所有xml文件及其路径 for root, dirs, files in os.walk(self.inputFilePath):for file in files:…

靓号管理-搜索

搜索手机号&#xff1a; 最后一条就是使用的关键mobile__contains 使用字典&#xff1a; 后端的逻辑&#xff1a; """靓号列表"""data_dict {}search_data request.GET.get(q, "")# 根据关键字进行搜索&#xff0c;如果关键字存在&…

综合项目 旅游网 【5.旅游线路收藏功能】

分析判断当前登录用户是否收藏过该线路当页面加载完成后&#xff0c;发送ajax请求&#xff0c;获取用户是否收藏的标记根据标记&#xff0c;展示不同的按钮样式编写代码后台代码RouteServlet/*** 判断当前登录用户是否收藏过该路线*/ public void isFavorite(HttpServletReques…

.md文件上传视频的踩坑经历小记

分别用QQ录制了前后两个视频&#xff0c;并利用video标签引用。这两个视频&#xff0c;明明代码一样&#xff0c;偏偏就一个成功&#xff0c;一个失败。 代码如下&#xff1a; <!-- 能够成功显示mp4视频 --> <video src"/images/video/2020110411.mp4" co…

海卡和海派有什么区别

一、海卡和海派有什么区别 海派和海卡实际上就是快船和慢船的区别。都是头程选用海运的方式&#xff0c;海派是到海港海关清关拆柜后&#xff0c;尾程配送是采用快递配送。而海卡则是到海港海关清关拆柜后&#xff0c;尾程选用货车配送。1、海派比较适用于小件货物 海派是海运抵…

OPenCV库移植到ARM开发板子上面配置过程

步骤一 1&#xff0c;环境准备去下载opencv官方的源码。 我这里用的是opencv-4.5.5版本的 2&#xff0c;还需要交叉编译工具一般&#xff0c;你交叉编译的工具板子厂家会提供工具&#xff0c;最好还是用板子厂家提供的交叉编译工具&#xff0c;因为我之前编译试过其他的交叉…

第一章:unity性能优化之内存优化

目录 前言 unity性能优化之内存的优化 一、unity Analysis工具的使用。 二、内存优化方法 1、设置和压缩图片 2、图片格式 3、动画文件 4、模型 5、RenderTexture&#xff08;RT&#xff09; 6、分辨率 7、资源的重复利用 8、shader优化 9、对bundle进行良好的管…

数字三角形

题目描述上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外&…

RK3399平台开发系列讲解(文件系统篇)虚拟文件系统的数据结构

🚀返回专栏总目录 文章目录 一、超级块二、挂载描述符三、文件系统类型四、索引节点五、目录项沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍虚拟文件系统的数据结构。 一、超级块 文件系统的第一块是超级块,用来描述文件系统的总体信息。当我们把文件系…

【论文速递】Arxiv2018 - 加州伯克利大学借助引导网络实现快速、准确的小样本分割

【论文速递】Arxiv2018 - 加州伯克利大学借助引导网络实现快速、准确的小样本分割 【论文原文】&#xff1a;Few-Shot Segmentation Propagation with Guided Networks 【作者信息】&#xff1a;Kate Rakelly∗ Evan Shelhamer∗ Trevor Darrell Alexei Efros Sergey Levine …

源码深度解析Spring Bean的加载

在应用spring 的过程中&#xff0c;就会涉及到bean的加载&#xff0c;bean的加载经历一个相当复杂的过程&#xff0c;bean的加载入口如下&#xff1a; 使用getBean&#xff08;&#xff09;方法进行加载Bean&#xff0c;最终调用的是AbstractBeanFactory.doGetBean() 进行Bean的…

Hudi-基本概念(时间轴、文件布局、索引、表类型、查询类型、数据写、数据读、Compaction)

文章目录基本概念时间轴(TimeLine)文件布局&#xff08;File Layout&#xff09;Hudi表的文件结构Hudi存储的两个部分Hudi的具体文件说明索引&#xff08;Index&#xff09;原理索引选项全局索引与非全局索引索引的选择策略对事实表的延迟更新对事件表的去重对维度表的随机更删…

23岁去培训机构学习Java可以成功吗?

当然是可以的&#xff01; 23岁这么美好的年纪&#xff0c;要是小课重回23岁&#xff0c;一定好好学习&#xff0c;努力克服一切困难障碍。可惜是没有时光机器可以穿梭到过去。所以你在这么美好的年纪&#xff0c;有自己喜欢想学习的专业一定要好好学习&#xff0c;天天向上&a…

DVWA之文件上传

一、概念&#xff1a;指由于程序员在对用户文件上传部分的控制不足或者处理缺陷&#xff0c;而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马&#xff0c;病毒&#xff0c;恶意脚本或者WebShell等。“文件上传”本身没有问题&…

linux设置登录失败处理功能(密码错误次数限制、pam_tally2.so模块)和操作超时退出功能(/etc/profile)

一、登录失败处理功能策略 1、登录失败处理功能策略&#xff08;服务器终端&#xff09; &#xff08;1&#xff09;编辑系统/etc/pam.d/system-auth 文件&#xff0c;在 auth 字段所在的那一部分添加如下pam_tally2.so模块的策略参数&#xff1a; auth required pam_tally2…

压电陶瓷换能器导纳圆图公式推导及匹配

压电陶瓷换能器的等效电路图如下图所示&#xff0c;分为左右两个部分左边的电容和电阻并联构成了电路的静态支路&#xff0c;被称为静态电容&#xff0c;可以由电表很方便的测量得到&#xff0c;这部分的参数是由换能器的电学参数决定的。右边的串联构成了动态支路&#xff0c;…

dfs(八)数字的全排列 (含有重复项与非重复项)

如果每个数字任意取的话。就不需要加book标志位 没有重复项数字的全排列_牛客题霸_牛客网 描述 给出一组数字&#xff0c;返回该组数字的所有排列 例如&#xff1a; [1,2,3]的所有排列如下 [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]. &#xff08;以数字在数组中的位…

k8s核心概念—Pod Controller Service介绍——20230213

文章目录一、Pod1. pod概述2. pod存在意义3. Pod实现机制4. pod镜像拉取策略5. pod资源限制6. pod重启机制7. pod健康检查8. 创建pod流程9. pod调度二、Controller1. 什么是Controller2. Pod和Controller关系3. deployment应用场景4. 使用deployment部署应用&#xff08;yaml&a…