第二章:Swagger2

news2024/11/19 4:29:48

目录

背景介绍

什么是Swagger2

常用注解

SpringBoot整合Swagger2

生产环境下屏蔽Swagger2

修改Swagger2配置类

修改application.yml

使用maven package打包测试

运行测试


背景介绍

在团队开发中,一个好的 API 文档不但可以减少大量的沟通成本,还可以帮助一位新人快速上手业务。传统的做法是由开发人员创建一份 RESTful API 文档来记录所有的接口细节,并在程序员之间代代相传。这种做法存在以下几个问题:

1)API 接口众多,细节复杂,需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等,想要高质量的完成这份文档需要耗费大量的精力;

2)难以维护。随着需求的变更和项目的优化、推进,接口的细节在不断地演变,接口描述文档也需要同步修订,可是文档和代码处于两个不同的媒介,除非有严格的管理机制,否则很容易出现文档、接口不一致的情况;

Swagger2 的出现就是为了从根本上解决上述问题。它作为一个规范和完整的框架,可以用于生成、描述、调用和可视化 RESTful 风格的 Web 服务:

  • 接口文档在线自动生成,文档随接口变动实时更新,节省维护成本;

  • 支持在线接口测试,不依赖第三方工具;

什么是Swagger2

Swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,现在我们使用spring boot 整合它。作用:

  • 接口的文档在线自动生成;

  • 功能测试;

常用注解

注解描述
@Api将类标记为 Swagger 资源。
@ApiImplicitParam表示 API 操作中的单个参数。
@ApiImplicitParams允许多个 ApiImplicitParam 对象列表的包装器。
@ApiModel提供有关 Swagger 模型的其他信息。
@ApiModelProperty添加和操作模型属性的数据。
@ApiOperation描述针对特定路径的操作或通常是 HTTP 方法。
@ApiParam为操作参数添加额外的元数据。
@ApiResponse描述操作的可能响应。
@ApiResponses允许多个 ApiResponse 对象列表的包装器。
@Authorization声明要在资源或操作上使用的授权方案。
@AuthorizationScope描述 OAuth2 授权范围。

SpringBoot整合Swagger2

导入依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
    <exclusions>
        <exclusion>
            <artifactId>swagger-models</artifactId>
            <groupId>io.swagger</groupId>
        </exclusion>
    </exclusions>
</dependency>
​
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.8.5</version>
</dependency>
​
<!-- 使用1.5.22-->
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-models</artifactId>
    <version>1.5.22</version>
</dependency>

创建Swagger配置类

@Configuration
//开启Swagger2
@EnableSwagger2
//配置生产环境下不可用  dev(开发)、test(测试)、prod(生产)
@Profile({"dev","test"})
public class Swagger2Configuration extends WebMvcConfigurationSupport {
    //api接口包扫描路径
    public static final String
            SWAGGER_SCAN_BASE_PACKAGE = "com.lky.swagger2pro.controller";
    //指定当前Swagger API文档版本
    public static final String VERSION = "1.0.0";
​
    /**
     * 创建API应用
     * apiInfo() 增加API相关信息
     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
     * 本例采用指定扫描的包路径来定义指定要建立API的目录。
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 接口文档的基本信息
                .apiInfo(apiInfo())
                .select()
                // 方法需要有ApiOperation注解才能生存接口文档
                //.apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // 路径使用any风格
                .paths(PathSelectors.any())
                .build();
    }
​
    /**
     * 创建该API的基本信息(这些基本信息会展现在文档页面中)
     * 访问地址:http://项目实际地址/doc.html
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SpringBoot中使用Swagger2构建RestFul APIs")
                .description("测试系统")
                //.termsOfServiceUrl("http://www.**.com")
                .version(VERSION)
                .build();
    }
​
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

1) 完成以上配置之后,通过mybatis-generator生成model和mapper; 2) 创建IBookService及BookServiceImpl实现类; 3) 创建BookController

综合案例

@Api

@Api注解用在类上,说明该类的作用。可以标记一个Controller类做为swagger文档资源。

属性说明
valueurl的路径值
tags如果设置这个值、value的值会被覆盖
produces返回的格式类型例如:"application/json, application/xml"
consumes接收请求参数的类型例如:"application/json, application/xml"
protocolsPossible values: http, https, ws, wss.
authorizations高级特性认证时配置

案例演示

@RestController
@Api(value = "书本管理",tags = {"书本管理"}) //tags可以代替value属性
@RequestMapping("/book")
public class BookController {
    ...
}

@ApiOperation

@ApiOperation注解用在方法上,说明方法的作用,每一个url资源的定义。

属性说明
valueurl的路径值
tags如果设置这个值、value的值会被覆盖
produces返回的格式类型例如:"application/json, application/xml"
consumes接收请求参数的类型例如:"application/json, application/xml"
hidden是否在文档中显示
notes注释说明
response返回的对象
responseContainer这些对象是有效的 "List", "Set" or "Map".,其他无效
responseReference指定对响应类型的引用。指定的引用可以是本地的,也可以是远程的*将按原样使用,并覆盖任何指定的response()类
responseHeaders响应旁边提供的可能标题列表
httpMethod"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" and "PATCH"
codehttp的状态码 默认 200

案例演示

@ApiOperation(value = "查询所有书本信息", notes = "查询返回所有书本信息集合",
            produces = "application/json")
@GetMapping(value="/queryAll")
public JsonResponseBody<List<Book>> queryAll(){
    try {
        return bookService.queryAll();
    } catch (Exception e) {
        e.printStackTrace();
        return new JsonResponseBody<>(500,e.getMessage());
    }
}

@ApiImplicitParam

@ApilmplicitParam 注解用来描述一个参数,可以配置参数的中文含义,也可以给参数设置默认值,这样在接口测试的时候可以避免手动输入;

属性说明
paramType参数放在哪个地方
name参数名称
value参数代表的含义
dataType参数类型
dataTypeClass参数类型
required是否必要
defaultValue参数的默认值

paramType

类型作用
path以地址的形式提交数据,用于restful接口。请求参数采用@PathVariable获取
query直接跟参数完成自动映射赋值。请求参数可采用@RequestParam获取
body以流的形式提交,仅支持POST。请求参数采用@RequestBody获取
header参数在request headers里边提交。请求参数采用@RequestHeader获取
form以form表单的形式提交,仅支持POST。

案例演示

@ApiOperation(value="查询单个书本信息",notes = "查询单个书本信息")
@ApiImplicitParam(value="书本ID",name="bookid",required = true,dataType = "String",defaultValue = "8f46b5018a6811e9a9c528d24413c293" )
@GetMapping("/querySingleBook")
public Book querySingleBook(String bookid){
    JsonResponseBody<Book> json = bookService.selectByPrimaryKey(bookid);
    return json.getData();
}

@ApiImplicitParams

@ApilmplicitParams 如果有多个参数,则需要使用多个 @ApilmplicitParam 注解来描述, 多个 @ApilmplicitParam 注解需要放在一个 @ApilmplicitParams 注解中;

案例演示

@ApiOperation(value = "新增书本信息", notes = "新增书本信息"
            ,produces = "application/json",consumes = "application/json")
@ApiImplicitParams({
            @ApiImplicitParam(name="bookname",value="书本名称",required = true,dataType = "String"),
            @ApiImplicitParam(name="price",value="书本价格",required = true,dataType = "Double"),
            @ApiImplicitParam(name="booktype",value="书本类型",required = true,dataType = "String")
})
@PostMapping("/addBook")
public JsonResponseBody<?> addBook(@RequestParam String bookname,
                                   @RequestParam Double price,
                                   @RequestParam String booktype){
    return bookService.insert(Book.builder()
        .bookid(UUID.randomUUID().toString().replace("-",""))
        .bookname(bookname)
        .booktype(booktype)
        .price(price)
        .build());
}

@ApiModel和@ApiModelProperty

@ApiModel注解描述一个Model的信息(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用 @ApiImplicitParam注解进行描述的时候;

@ApiModelProperty注解描述一个model的属性。

属性说明
value字段说明
name参数名称
dataType参数类型
hidden在文档中隐藏
required是否必要
example举例说明
notes注释说明

案例演示

Controller

@ApiOperation(value="修改书本信息",notes = "修改书本信息")
@PostMapping("/editBook")
public JsonResponseBody<?> editBook(@RequestBody Book book){
    return bookService.updateByPrimaryKey(book);
}

注意:在这里可以不使用@ApiImplicitParam标注Swagger中的参数信息,因为在这里的输入参数是实体对象,而在实体对象中已经使用@ApiModel和@ApiModelProperty注解进行了标识。

Book实体类

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value="书本对象")
public class Book implements Serializable {
​
    /**
     * 书本编号
     */
    @ApiModelProperty(value="书本编号")
    private String bookid;
​
    /**
     * 书本名称
     */
    @ApiModelProperty(value="书本名称")
    private String bookname;
​
    /**
     * 书本价格
     */
    @ApiModelProperty(value="书本价格")
    private Double price;
​
    /**
     * 书本类型
     */
    @ApiModelProperty(value="书本类型")
    private String booktype;
​
    private static final long serialVersionUID = 1L;
}

@ApiParam

作用在方法的参数上,用来描述接口的参数信息(一个参设置一个)

@ApiParam必须与@RequestParam@PathVariable@RequestHeader一起使用。

属性说明
name参数名称
value参数简单描述
defaultValue描述参数默认值
required是否为必传参数, false:非必传; true:必传
allowMultiple指定参数是否可以通过多次出现来接收多个值
hidden隐藏参数列表中的参数
example非请求体(body)类型的单个参数示例
examples@Example(value = @ExampleProperty(mediaType = “”, value = “”)) 参数示例,仅适用于请求体类型的请求

案例演示

@ApiOperation(value="新增书本信息1",notes="新增书本信息1")
@PostMapping("/addBooks")
public JsonResponseBody<?> addBooks(
            @ApiParam(name="bookName",value="bookName",required = true) @RequestParam("bookName") String bookName,
            @ApiParam(name="price",value="price",required = true) @RequestParam("price") float price,
            @ApiParam(name="bookType",value="bookType",required = true) @RequestParam("bookType") String bookType){
      System.out.println("bookName="+bookName+",price="+price+",bookType="+bookType);
    return new JsonResponseBody<>();
}

生产环境下屏蔽Swagger2

为了保证接口文档的安全,禁用了生产环境的加载,具体说明请看:

参考地址:https://www.jianshu.com/p/fa3230ffb27c

一般生产环境是不能放开swagger的,这样接口暴露在外网很不安全!!!

一般生产环境是不能放开swagger的,这样接口暴露在外网很不安全!!!

一般生产环境是不能放开swagger的,这样接口暴露在外网很不安全!!!

修改Swagger2配置类

添加@Profile注解,指明在何种环境下可以使用Swagger2,一般情况下只有在开发(dev)和测试(test)环境下才可以使用Swagger2;而在生产(dev)环境下不能使用Swagger2。

@Configuration
//开启Swagger2
@EnableSwagger2
//配置生产环境下不可用  dev(开发)、test(测试)、prod(生产)
@Profile({"dev","test"})
public class Swagger2Configuration extends WebMvcConfigurationSupport {
    
    ...

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

修改application.yml

修改application.yml文件,配置项目系统的运行环境(dev/test/prod)

spring:
  #配置swagger2生产和测试环境不可用
  profiles:
    active: prod

使用maven package打包测试

运行测试

打开CMD,跳转到target目录,输入命令:java -jar .\xxx.jar --spring.profiles.active=prod。可以直接打开jar包修改application.yml配置文件中spring.profiles.active属性切换运行环境,具体请参考以下配置:

开发环境:dev;

生产环境:prod;

测试环境:test;

 以上就是今天有关于Swagger2的介绍和使用!

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

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

相关文章

Linux系统的进程管理

文章目录Linux系统的进程管理1.查看进程2.父进程3.终止进程4.进程树Linux系统的进程管理 在LINUX中&#xff0c;每个执行的程序都称为一个进程。每一个进程都分配一个ID号(pid,进程号) 每个进程都可能以两种方式存在的。前台与后台&#xff0c;所谓前台进程就是用户目前的屏幕…

Vulnhub 靶场 Earth

通关方案&#xff1a;https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html 思路流程&#xff1a; 1. 信息收集 nmap扫描发现开了22端口和两个web端口&#xff08;80和443&#xff09;。 注意这里信息收集到到位&#xff0c;获取的信息多一些。 使用nmap默认脚…

常见的降维技术比较:能否在不丢失信息的情况下降低数据维度

本文将比较各种降维技术在机器学习任务中对表格数据的有效性。我们将降维方法应用于数据集&#xff0c;并通过回归和分类分析评估其有效性。我们将降维方法应用于从与不同领域相关的 UCI 中获取的各种数据集。总共选择了 15 个数据集&#xff0c;其中 7 个将用于回归&#xff0…

电子招标采购系统源码—互联网+招标采购

​ ​ 智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#x…

Kong动态负载均衡与服务发现

Kong动态负载均衡一、背景二、通过docker 安装 Kong三、分布式API网关存在的意义四、Kong 的相关特性五、Kong 体系结构六、Kong 工作流程七、从 nginx 配置到 Kong 配置7.1、Kong 核心四对象7.2、四对象关系八、插件机制九、Kong 网关插件十、使用konga10.1、实现一个负载均衡…

sklearn预测评估指标计算详解:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1score

目录 前言 一、准确率 二、精确率 三、召回率 四、F1-score 点关注&#xff0c;防走丢&#xff0c;如有纰漏之处&#xff0c;请留言指教&#xff0c;非常感谢 前言 很多时候需要对自己模型进行性能评估&#xff0c;对于一些理论上面的知识我想基本不用说明太多&#xff0…

工具及方法 - 项目管理工具ProjectLibre

这个项目管理工具是开源和免费的&#xff0c;可以作为微软Project工具的平替。官网是 http://www.projectlibre.org 。 下载&#xff1a; ProjectLibre - Project Management download | SourceForge.net 当前的最新版本是2021-01-08的1.9.3版本&#xff0c;而现在是2022-12月…

路由交换网络技术,交换机基础入门及相关特性介绍

一、交换机:工作在数据链路层 ,转发数据帧 HUB所有接口再同一个冲突域,交换机每个接口都属于一个冲突域 交换机功能: 1、学习 2、转发 3、泛洪 4、丢弃 二、学习MAC地址及转发 MAC地址表项默认老化时间300秒。如果在300秒之内收到同一主机从同一接口发来的帧,老化时…

web3:区块链Blockchain

在此声明&#xff0c;仅做分享&#xff0c;绝不存在倡导炒币行为 目录区块链概念区块链基础知识交易(Transaction)区块(Block)链(Chain)公私钥区块链存储结构简单理解区块结构Block区块头Merkle根nonce区块链原理区块链架构区块链特点分布式账本—不可篡改性、去中心化非对称加…

ThinkPHP5之SQLI审计分析(一)

说明 该文章来源于徒弟lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明0x00 测试代码做了什么&#xff1f;0x01 调用链分析0x02 分析最内层调用的处理0x03 分析上一层调用的处理0x04 Payload构造Time&#xff1a;8-31 影响版…

pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为4239字&#xff0c;预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型&#xff0c;然后在Windows平台用C OpenCV DNN推理都实现了&#xff0c;这篇就来看看在Android端直接实现一个手写数字识别的功…

The Open Group亚太区总经理Chris Forde元旦贺词:踔厉奋发、笃行不怠,共赴新未来!

Happy New Year everyone, hope you are enjoying the holiday season, and perhaps planning your New Year’s resolutions. 大家新年快乐&#xff01;希望此刻您正在享受假期&#xff0c;或在规划自己的新年决心。 Now is the time for me, with you, to say goodbye to 202…

PDF怎么转换成Word?电脑必备的转换工具

电脑上的办公场景可以说是很多样了&#xff0c;而现在线上办公&#xff0c;线上会议&#xff0c;以及线上网课等的发展越来越全面&#xff0c;关于文件的编辑和传输也渐渐需要更多的软件来辅助我们办公。就像是PDF文件格式和Word文件格式这两种常见的格式&#xff0c;想要直接进…

小米路由器 R4A 刷原生 OpenWrt 后的风景

简 述: 继上篇 小米AX6S刷OpenWrt和开启OpenClash 后&#xff0c;手痒难耐&#xff0c;决定把小米路由器4A千兆版(R4A)路由器 给刷个原生的 OpenWrt。 文章目录背景刷成原生 OpenWrt原生 OpenWrt 基础操作开启 WiFiopkg 换源设置中文OpenClash 插件8M 之殇&#xff0c;终结Refe…

JavaSE学习(二)

1.基本数据类型转换 自动类型转换 1.java程序在进行赋值或运算的时候&#xff0c;会将精度小的类型自动转换为精度大的数据类型再进行计算 2.精度大的类型赋值给精度小的类型会报错&#xff0c;反之则会进行自动类型转换 int a4; floata1.1;这样写是错的&#xff0c;因为1.1是…

Uni-app + Vue3 + TS +Vite 创建项目

一、npx 与 npm 区别 npm 都很熟&#xff0c;可是与 npm 如此相似的 npx 是干嘛的呢&#xff1f;我们为甚要介绍 npx ? 由于 uni-app 官方提供创建命令使用的是 npx&#xff0c;所以我们先来了解下 npx 是干什么的&#xff1f;它与 npm 的区别。 npx 是 npm 的高级版本&…

java 出现unreachable statement异常 原因检查

unreachable statement异常&#xff1a; 今天在写代码的过程中&#xff0c;发现有行代码变红线&#xff0c;显示unreachable statement异常&#xff0c;但是代码本身没什么问题&#xff0c;通过查询资料发现其实就是该行代码不可执行的原因&#xff0c;出现该异常共有以下两种…

第三十八章 贪心算法——区间问题(上)

第三十八章 贪心策略——区间相关问题一、什么贪心策略&#xff1f;二、区间问题合集1、思路&#xff1a;2、问题1&#xff1a; 区间选点&#xff08;1&#xff09;问题&#xff08;2&#xff09;思路和证明a.思路b.证明&#xff08;3&#xff09;代码3、问题2&#xff1a;&…

Linux系统编程——基础篇

文章目录一、快捷键二、文件1.重要文件2.文件类型3.cp4.增加权限5.修改三、查找和检索四、安装五、压缩与解压六、vim的三种工作方式七、gcc编译四步骤八、静态库和动态库一、快捷键 Ctrla&#xff1a;光标移到开头 Ctrle&#xff1a;光标移到结尾 Ctrlu&#xff1a;清除整行 …

SQLSERVER 居然也能调 C# 代码 ?

一&#xff1a;背景 1. 讲故事 前些天看到一个奇怪的 Function 函数&#xff0c;调用的是 C# 链接库中的一个 UserLogin 方法&#xff0c;参考代码如下&#xff1a; CREATE FUNCTION dbo.clr_UserLogin (name AS NVARCHAR(100),password AS NVARCHAR(100) ) RETURNS INT AS…