7. 实现 API 自动生成

Swagger 简介:Swagger 是⼀套 API 定义的规范 ,按照这套规范的要求去定义接口及接口相关信息, 再通过可以解析这套规范工具,就可以生成各种格式的接口文档,以及在线接口调试页面,通过自动文档的方式,解决了接口文档更新不及时的问题。
Springfox 简介:是对 Swagger 规范解析并生成文档的⼀个实现。

1. pom.xml中引用依赖

统⼀管理版本,在 properties 标签中加入版本号:

<springfox-boot-starter.version>3.0.0</springfox-boot-starter.version>

3.0.0 版本对应 Spring Boot 2.6 之前的版本,但是随着 Spring Boot 的更新 Springfox 并没有进行同步的更新,所以存在一些兼容性问题,因此我们选择使用 SpringBoot 2.7.6 版本。

2. 引入相关的依赖

<!-- API⽂档⽣成,基于swagger2 -->
<dependency>
 <groupId>io.springfox</groupId>
 <artifactId>springfox-boot-starter</artifactId>
 <version>${springfox-boot-starter.version}</version>
</dependency>
<!-- SpringBoot健康监控 -->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3. 编写配置类

  • 在com.bitejiuyeke.forum.config 包下新建SwaggerConfig.java
  • 解决 SpringBoot 2.6.0 以上与 Springfox3.0.0 不兼容的问题,涉及 SpringBoot 版本升级过程中的一 些内部实现变化,具体说明在修改配置文件部分

 将以下代码复制到 SwaggerConfig 类中:

package com.example.demo.controller;

import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
import org.springframework.boot.actuate.endpoint.web.*;
import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
 * Swagger配置类
 */
// 配置类
@Configuration
// 开启Springfox-Swagger
@EnableOpenApi
public class SwaggerConfig {
    /**
     * Springfox-Swagger基本配置
     * @return
     */
    @Bean
    public Docket createApi() {
        Docket docket = new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }
    // 配置API基本信息
    private ApiInfo apiInfo() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("论坛系统API")
                .description("论坛系统前后端分离API测试")
                .contact(new Contact("Test",
                        "https://hello.fprum.com", "1111111111@qq.com"))
                .version("1.0")
                .build();
        return apiInfo;
    }
    /**
     * 解决SpringBoot 6.0以上与Swagger 3.0.0 不兼容的问题
     * 复制即可
     **/
    @Bean
    public WebMvcEndpointHandlerMapping
    webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,

                                     ServletEndpointsSupplier servletEndpointsSupplier,

                                     ControllerEndpointsSupplier controllerEndpointsSupplier,

                                     EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,

                                     WebEndpointProperties webEndpointProperties, Environment environment) {
        List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
        Collection<ExposableWebEndpoint> webEndpoints =
                webEndpointsSupplier.getEndpoints();
        allEndpoints.addAll(webEndpoints);
        allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
        allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
        String basePath = webEndpointProperties.getBasePath();
        EndpointMapping endpointMapping = new EndpointMapping(basePath);
        boolean shouldRegisterLinksMapping =
                this.shouldRegisterLinksMapping(webEndpointProperties, environment,
                        basePath);
        return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints,
                endpointMediaTypes,
                corsProperties.toCorsConfiguration(), new
                EndpointLinksResolver(allEndpoints, basePath),
                shouldRegisterLinksMapping, null);
    }
    private boolean shouldRegisterLinksMapping(WebEndpointProperties
                                                       webEndpointProperties, Environment environment,
                                               String basePath) {
        return webEndpointProperties.getDiscovery().isEnabled() &&
                (StringUtils.hasText(basePath)
                        ||
                        ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
    }
}

4. application.yml 中添加配置

  • 在 spring 节点下添加 mvc 配置项
由于 SpringBoot 2.6 之后版本把 SpringMVC 路径匹配策略修改为 MatchingStrategy. PATH_PATTERN_PARSER;
而 Springfox-Swagger 还没有更新版本,我们暂时先把 路径匹配策略回退到之前的
MatchingStrategy. ANT_PATH_MATCHER
 mvc:
   path match:
    matching-strategy: ANT_PATH_MATCHER #Springfox-Swagger兼容性配置

5. API 常用注解 

  •  @Api: 作用在 Controller 上,对控制器类的说明
    • tags="说明该类的作用,可以在前台界面上看到的注解"
  •  @ApiModel: 作用在响应的类上,对返回响应数据的说明
  •  @ApiModelProerty:作用在类的属性上,对属性的说明
  •  @ApiOperation: 作用在具体方法上,对 API 接口的说明
  •  @ApiParam: 作用在方法中的每⼀个参数上,对参数的属性进行说明

6. 访问 API 列表

启动程序,在浏览器中输入网址:http://127.0.0.1:58080/swagger-ui/index.html

可以正常运行并显示接口信息,说明配置成功,此时接口信息已经显示出来了,可以分别针每个接口进测试,具操作按页面指引即可。

点击“测试接口”出现如下图所示: 

选择对应的 API 列表,点击“Try it out”: 

点击 Execute: 

图中箭头所指方向即为测试结果。

带有参数的同样可以进行测试:

7. API 导入 Postman

获取 API 地址,打开 Swagger 页面的 API 资源地址并复制:

 在 Postman 中导入 url:

接下来输入参数:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现自动生成相框功能可以结合HTML5的Canvas和拖放API来完成。具体实现步骤如下: 1. HTML布局 首先,我们需要在HTML中定义一个Canvas元素和一个可以拖放的图片元素。 ```html <canvas id="canvas"></canvas> <img id="image" src="path/to/image.jpg" draggable="true"> ``` 2. JS处理拖放事件 接下来,我们需要通过JS来处理图片元素的拖放事件,并将拖放的图片渲染到Canvas上。 ```javascript var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); var image = document.getElementById("image"); image.addEventListener("dragstart", function(event) { // 阻止默认拖放行为 event.preventDefault(); }); canvas.addEventListener("dragover", function(event) { // 阻止默认拖放行为 event.preventDefault(); }); canvas.addEventListener("drop", function(event) { // 阻止默认拖放行为 event.preventDefault(); // 获取拖放的图片 var file = event.dataTransfer.files[0]; // 创建一个图片对象并设置src属性 var image = new Image(); image.src = URL.createObjectURL(file); // 图片加载完成后,绘制到Canvas上 image.onload = function() { context.drawImage(image, 0, 0); }; }); ``` 3. 实现生成相框功能 最后,我们需要实现生成相框功能。这里简单起见,我们直接在Canvas上绘制一个相框。 ```javascript // 绘制相框 context.beginPath(); context.lineWidth = "10"; context.strokeStyle = "white"; context.rect(0, 0, canvas.width, canvas.height); context.stroke(); ``` 完整代码如下: ```html <canvas id="canvas"></canvas> <img id="image" src="path/to/image.jpg" draggable="true"> <script> var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); var image = document.getElementById("image"); image.addEventListener("dragstart", function(event) { // 阻止默认拖放行为 event.preventDefault(); }); canvas.addEventListener("dragover", function(event) { // 阻止默认拖放行为 event.preventDefault(); }); canvas.addEventListener("drop", function(event) { // 阻止默认拖放行为 event.preventDefault(); // 获取拖放的图片 var file = event.dataTransfer.files[0]; // 创建一个图片对象并设置src属性 var image = new Image(); image.src = URL.createObjectURL(file); // 图片加载完成后,绘制到Canvas上 image.onload = function() { context.drawImage(image, 0, 0); // 绘制相框 context.beginPath(); context.lineWidth = "10"; context.strokeStyle = "white"; context.rect(0, 0, canvas.width, canvas.height); context.stroke(); }; }); </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值