当前位置:   article > 正文

Swagger2入门

swagger2

目录

1.背景介绍

2.什么是Swagger2

3.常用注解

4.SpringBoot整合Swagger2

4.1.导入依赖

4.2.创建Swagger配置类

4.3.综合案例​编辑

@Api

@ApiOperation

@ApiImplicitParam

@ApiImplicitParams

@ApiModel和@ApiModelProperty

@ApiParam

5.生产环境下屏蔽Swagger2

5.1.修改Swagger2配置类

5.2.修改application.yml

5.3.使用maven package打包测试​编辑

5.4.运行测试


1.背景介绍

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

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

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

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

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

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

2.什么是Swagger2

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

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

  • 功能测试;

3.常用注解

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

4.SpringBoot整合Swagger2

4.1.导入依赖

  1. <dependency>
  2.    <groupId>io.springfox</groupId>
  3.    <artifactId>springfox-swagger2</artifactId>
  4.    <version>2.9.2</version>
  5.    <exclusions>
  6.        <exclusion>
  7.            <artifactId>swagger-models</artifactId>
  8.            <groupId>io.swagger</groupId>
  9.        </exclusion>
  10.    </exclusions>
  11. </dependency>
  12. <dependency>
  13.    <groupId>com.github.xiaoymin</groupId>
  14.    <artifactId>swagger-bootstrap-ui</artifactId>
  15.    <version>1.8.5</version>
  16. </dependency>
  17. <!-- 使用1.5.22-->
  18. <dependency>
  19.    <groupId>io.swagger</groupId>
  20.    <artifactId>swagger-models</artifactId>
  21.    <version>1.5.22</version>
  22. </dependency>

4.2.创建Swagger配置类

  1. @Configuration
  2. //开启Swagger2
  3. @EnableSwagger2
  4. //配置生产环境下不可用 dev(开发)、test(测试)、prod(生产)
  5. @Profile({"dev","test"})
  6. public class Swagger2Configuration extends WebMvcConfigurationSupport {
  7.    //api接口包扫描路径
  8.    public static final String
  9.            SWAGGER_SCAN_BASE_PACKAGE = "com.lky.swagger2pro.controller";
  10.    //指定当前Swagger API文档版本
  11.    public static final String VERSION = "1.0.0";
  12.    /**
  13.     * 创建API应用
  14.     * apiInfo() 增加API相关信息
  15.     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
  16.     * 本例采用指定扫描的包路径来定义指定要建立API的目录。
  17.     * @return
  18.     */
  19.    @Bean
  20.    public Docket createRestApi() {
  21.        return new Docket(DocumentationType.SWAGGER_2)
  22.                // 接口文档的基本信息
  23.               .apiInfo(apiInfo())
  24.               .select()
  25.                // 方法需要有ApiOperation注解才能生存接口文档
  26.                //.apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
  27.               .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  28.                // 路径使用any风格
  29.               .paths(PathSelectors.any())
  30.               .build();
  31.   }
  32.    /**
  33.     * 创建该API的基本信息(这些基本信息会展现在文档页面中)
  34.     * 访问地址:http://项目实际地址/doc.html
  35.     * @return
  36.     */
  37.    private ApiInfo apiInfo() {
  38.        return new ApiInfoBuilder()
  39.               .title("SpringBoot中使用Swagger2构建RestFul APIs")
  40.               .description("测试系统")
  41.                //.termsOfServiceUrl("http://www.**.com")
  42.               .version(VERSION)
  43.               .build();
  44.   }
  45.    @Override
  46.    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
  47.        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
  48.        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  49.   }
  50. }

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

4.3.综合案例

@Api

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

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

案例演示

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

@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

案例演示

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

@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。

案例演示

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

@ApiImplicitParams

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

案例演示

  1. @ApiOperation(value = "新增书本信息", notes = "新增书本信息"
  2.           ,produces = "application/json",consumes = "application/json")
  3. @ApiImplicitParams({
  4.            @ApiImplicitParam(name="bookname",value="书本名称",required = true,dataType = "String"),
  5.            @ApiImplicitParam(name="price",value="书本价格",required = true,dataType = "Double"),
  6.            @ApiImplicitParam(name="booktype",value="书本类型",required = true,dataType = "String")
  7. })
  8. @PostMapping("/addBook")
  9. public JsonResponseBody<?> addBook(@RequestParam String bookname,
  10.                                   @RequestParam Double price,
  11.                                   @RequestParam String booktype){
  12.    return bookService.insert(Book.builder()
  13.       .bookid(UUID.randomUUID().toString().replace("-",""))
  14.       .bookname(bookname)
  15.       .booktype(booktype)
  16.       .price(price)
  17.       .build());
  18. }

@ApiModel和@ApiModelProperty

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

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

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

案例演示

Controller

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

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

Book实体类

  1. @Data
  2. @Builder
  3. @AllArgsConstructor
  4. @NoArgsConstructor
  5. @ApiModel(value="书本对象")
  6. public class Book implements Serializable {
  7.    /**
  8.     * 书本编号
  9.     */
  10.    @ApiModelProperty(value="书本编号")
  11.    private String bookid;
  12.    /**
  13.     * 书本名称
  14.     */
  15.    @ApiModelProperty(value="书本名称")
  16.    private String bookname;
  17.    /**
  18.     * 书本价格
  19.     */
  20.    @ApiModelProperty(value="书本价格")
  21.    private Double price;
  22.    /**
  23.     * 书本类型
  24.     */
  25.    @ApiModelProperty(value="书本类型")
  26.    private String booktype;
  27.    private static final long serialVersionUID = 1L;
  28. }

@ApiParam

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

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

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

案例演示

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

5.生产环境下屏蔽Swagger2

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

参考地址:生产环境中禁用swagger - 简书

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

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

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

5.1.修改Swagger2配置类

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

  1. @Configuration
  2. //开启Swagger2
  3. @EnableSwagger2
  4. //配置生产环境下不可用 dev(开发)、test(测试)、prod(生产)
  5. @Profile({"dev","test"})
  6. public class Swagger2Configuration extends WebMvcConfigurationSupport {
  7.    
  8.   ...
  9.    @Override
  10.    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
  11.        registry.addResourceHandler("doc.html")
  12. .addResourceLocations("classpath:/META-INF/resources/");
  13.        registry.addResourceHandler("/webjars/**")
  14. .addResourceLocations("classpath:/META-INF/resources/webjars/");
  15.   }
  16. }

5.2.修改application.yml

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

  1. spring:
  2.  #配置swagger2生产和测试环境不可用
  3. profiles:
  4.   active: prod

5.3.使用maven package打包测试

5.4.运行测试

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

开发环境:dev; 生产环境:prod; 测试环境:test;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/939864
推荐阅读
相关标签
  

闽ICP备14008679号