swagger 3.0 学习笔记

news2024/9/23 23:26:39

引入pom

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

配置

import io.swagger.models.auth.In;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class SwaggerConfig
{
    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes()
    {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
        apiKeyList.add(new ApiKey("Head", "Head", In.HEADER.toValue()));
        apiKeyList.add(new ApiKey("Query", "Query", In.QUERY.toValue()));
        return apiKeyList;
    }

    /**
     * 安全上下文
     */
    private List<SecurityContext> securityContexts()
    {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                        .build());
        return securityContexts;
    }

    /**
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth()
    {
        AuthorizationScope[] authorizationScopes ={new AuthorizationScope("global", "accessEverything")} ;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        securityReferences.add(new SecurityReference("Head", authorizationScopes));
        securityReferences.add(new SecurityReference("Query", authorizationScopes));
        return securityReferences;
    }

     @Bean
      public Docket swagger3() {
          return new Docket(DocumentationType.OAS_30)
                  .select()
                  .apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class))
                  .paths(PathSelectors.regex("/test.*"))
                  .build()
                  .groupName("swagger3.0")
                  .securitySchemes(securitySchemes())
                  .securityContexts(securityContexts())
                  .apiInfo(apiInfo());
      }

    /**
     * 添加摘要信息
     */
    private ApiInfo apiInfo()
    {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title("标题:XXX系统_接口文档")
                // 描述
                .description("描述:xxxx.")
                // 作者信息
                .contact(new Contact("作者信息", null, null))
                // 版本
                .version("版本号: >...>")
                .build();
    }
}

可以加上全局请求参数
在这里插入图片描述

对象

ReqSwagger3VO

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
@Schema(name="ReqSwagger3VO",description ="swagger3对象" )
public class ReqSwagger3VO implements Serializable {
    private static final long serialVersionUID = 646541L;

    @Schema(description = "字符串",example = "aaaa")
    private String dataStr;

    @Schema(description = "数字",example = "1111")
    private Integer dataInt;

    @Schema(description = "字符数组" )
    private List<String> listStr;

    @Schema(description = "数字数组")
    private List<Integer> listInt;

    @Schema(description = "用户")
    private User user;
    @Schema(description = "用户数组")
    private  List<User> userList;

    @Schema(hidden = true)
    private String hiddenStr;
    private String hiddenNotStr;
}

User

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
//https://www.cnblogs.com/antLaddie/p/17418078.html
@Schema(description ="用户信息" )
@Data
@AllArgsConstructor
public class User {
    @Schema(description = "姓名",example = "张三")
    private String name;
    @Schema(description = "年龄",example = "18", format = "int32")
    private int age;
    @Schema( description = "学生分数属性", format = "double", example = "55.50")
    private Double fraction;
}

控制层

example 赋值问题还没解决


import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.StringWriter;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@RestController
@RequestMapping("/test/swagger")
@Tag(name = "接口类描述name",description = "接口类描述desc")
public class SwaggerController {

    @Operation(summary = "get请求")
    @GetMapping("{pathParam}/get")
    public Object get(
            @Parameter(description="reqParam参数描述",  schema = @Schema(allowableValues = {"aaa", "22222"}))
            @RequestParam String reqParam,
            @Parameter(description="pathParam参数描述",example = "111")
            @PathVariable Integer pathParam,
            @Parameter(description="headParam参数描述", schema = @Schema(allowableValues = {"888888"}))
            @RequestHeader Long headParam
    ){
        return null;
    }

    @Operation(summary = "get2请求,example赋值不生效",parameters={
            @Parameter(ref="reqParam",name = "reqParam",description="reqParam参数描述",in= ParameterIn.QUERY,  schema = @Schema(allowableValues = {"aaa", "22222"})),
            @Parameter(ref="pathParam", name = "pathParam",description="pathPatam参数描述",in= ParameterIn.PATH,schema = @Schema(allowableValues = {"11111", "333"})),
            @Parameter(ref="headParam", name = "headParam",description="headParam参数描述",in= ParameterIn.PATH,schema = @Schema(allowableValues = {"11111", "333"}))
    })
    @GetMapping("/2/{pathParam}/get")
    public Object get2(@RequestParam String reqParam,@PathVariable Integer pathParam ,@RequestHeader Long headParam){
        return null;
    }

    @Operation(summary = "post请求")
    @PostMapping("/post")
    public Object post(@RequestBody ReqSwagger3VO reqSwaggerVO){
        return null;
    }


    @Hidden
    @PostMapping("/hidden")
    public Object hidden(@RequestBody ReqSwaggerVO reqSwaggerVO){
        return null;
    }


    @Operation(summary = "文件上传")
    @PostMapping(value = "/upload")
    public Object uploadFile(@RequestParam(value = "file") @RequestPart MultipartFile file){

        return null;
    }

    @Operation(summary = "zip下载")
    @PostMapping(value = "/zip/download")
    public void downloadZip(HttpServletResponse response)throws Exception {

        String fileName ="file.zip";

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);

        for (int i = 0; i < 2; i++) {
            StringWriter sw = new StringWriter();
            sw.append("11111a"+i);
            sw.append("2222c"+i);
            // 添加到zip
            zip.putNextEntry(new ZipEntry(i+"name.txt"));
            IOUtils.write(sw.toString(), zip, "UTF-8");
            IOUtils.close(sw);
            zip.flush();
            zip.closeEntry();
        }

        IOUtils.close(zip);
        byte[] data = outputStream.toByteArray();

        response.reset();
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
        response.setHeader("Content-Disposition", "attachment; filename=\""+fileName+"\"");
        response.addHeader("Content-Length", "" + data.length);
        response.setContentType("application/octet-stream; charset=UTF-8");
        IOUtils.write(data, response.getOutputStream());
    }

}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

SpringBoot Thymeleaf模板引擎

Thymeleaf 模板引擎 前端交给我们的页面&#xff0c;是html页面。如果是我们以前开发&#xff0c;我们需要把他们转成jsp页面&#xff0c;jsp好处就是当我们查出一些数据转发到JSP页面以后&#xff0c;我们可以用jsp轻松实现数据的显示&#xff0c;及交互等。 jsp支持非常强大…

1077 Kuchiguse

PTA | 程序设计类实验辅助教学平台 一个测试点没过&#xff0c;不知道哪的原因 #include<bits/stdc.h> using namespace std; const int N210; int n; string s[N]; string str[N]; string ans; int main() {int len300;scanf("%d",&n);getchar();for(int…

[C初阶笔记]P1

什么是C语言 1、机器语言&#xff08;二进制&#xff09;>汇编语言&#xff08;助记符&#xff09;>高级语言&#xff08;C、C等&#xff09; 2、c语言擅长底层软件开发&#xff08;操作系统、驱动程序&#xff09;&#xff0c;并不意味着不能开发其他。 C语言更贴近操作…

linux挂载sd卡

1、确定设备名&#xff1a;打开终端窗口&#xff0c;运行以下命令来查看已连接的存储设备列表 rootws:/# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTmmcblk1 179:0 0 7.3G 0 disk |-mmcblk1p1 179:1 0 70M 0 part -mmcblk1p2 179:2 0…

用datagrip远程连接mysql超时怎么解决【连接mysql会遇到的坑】

目录 一.开放端口 【1】在linux打开防火墙或开放3306端口&#xff08;其实一般情况下服务器里的防火墙并没有开启&#xff09;​编辑 【2】在控制台的云安全组里开放端口 二.修改datagrip连接时高级的useSSL属性 先填好主机&#xff08;就是IP地址&#xff09;和端口&#…

ProComponent 用法学习

相信很多同学都用过 Ant Design 这一 react 著名组件库&#xff0c;而 ProComponents 则是在 antd 之上进行封装的页面级组件库&#xff08;指一个组件就可以搞定一个页面&#xff09;。它同时也是 Ant Design Pro 中后台框架所用的主要组件库。如果你手上有要用 react 开发的中…

Pytorch深度学习-----现有网络模型的使用及修改(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

photoshop PS 查看像素坐标、像素颜色、像素HSB颜色

方法一 photoshop 菜单栏 窗口菜单->信息菜单项(F8), 在信息窗口里会有当前的 x&#xff0c;y坐标 方法二 photoshop 菜单栏 视图菜单->标尺菜单项&#xff08;ctrlR&#xff09; 宽度和高度边上都有标尺&#xff0c;默认的是厘米&#xff0c;右键单机宽度和高度边上…

【自动化测试框架】关于unitttest你需要知道的事

一、UnitTest单元测试框架提供了那些功能 1.提供用例组织和执行 如何定义一条“测试用例”? 如何灵活地控制这些“测试用例”的执行? 2.提供丰定的断言方法 当测试用例的执行结果与预期结果不一致时&#xff0c;判定测试用例失败。在自动化测试中&#xff0c;通过“断言”…

【IMX6ULL驱动开发学习】04.应用程序和驱动程序数据传输和交互的4种方式:非阻塞、阻塞、POLL、异步通知

一、数据传输 1.1 APP和驱动 APP和驱动之间的数据访问是不能通过直接访问对方的内存地址来操作的&#xff0c;这里涉及Linux系统中的MMU&#xff08;内存管理单元&#xff09;。在驱动程序中通过这两个函数来获得APP和传给APP数据&#xff1a; copy_to_usercopy_from_user …

MySQL之深入InnoDB存储引擎——Undo页

文章目录 一、UNDO日志格式1、INSERT操作对应的UNDO日志2、DELETE操作对应的undo日志3、UPDATE操作对应的undo日志1&#xff09;不更新主键2&#xff09;更新主键的操作 3、增删改操作对二级索引的影响 二、UNDO页三、UNDO页面链表四、undo日志具体写入过程五、回滚段1、回滚段…

Java课题笔记~ Servlet编程

1.Servlet编程基础 (1)什么是Servlet Servlet是基于Java语言的Web编程技术&#xff0c;部署在服务器端的Web容器里&#xff0c;获取客户端的访问请求&#xff0c;并根据请求生成响应信息返回给客户端。 创建Servlet的方式&#xff0c;有 如下图&#xff1a;一般创建Servlet都…

Vue3 表单输入绑定简单应用

去官网学习→表单输入绑定 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 表单输入绑定</h1><input type"text" placeholder"输入框" v-model"msg"…

Open_PN笔记

>>>仅用作学习用途 1.准备好需要用到的工具 官网下载地址&#xff1a; openvpn 客户端下载地址&#xff1a; https://swupdate.openvpn.org/community/releases/openvpn-install-2.4.5-I601.exe EasyRSA下载地址&#xff1a; https://githu…

4、Rocketmq之存储原理

CommitLog ~ MappedFileQueue ~ MappedFile集合

web-初始前端

不区分大小写&#xff0c;单双引号&#xff0c; <html><head><title>初识HTML</title></head><body><h1>Hello world!</h1><img src OIF-C.jfif/></body> </html> <!-- 文件格式 --> <!DOCTYPE h…

PoseFormer:基于视频的2D-to-3D单人姿态估计

3D Human Pose Estimation with Spatial and Temporal Transformers论文解析 摘要1. 简介2. Related Works2.1 2D-to-3D Lifting HPE2.2 GNNs in 3D HPE2.3 Vision Transformers 3. Method3.1 Temporal Transformer Baseline3.2 PoseFormer: Spatial-Temporal TransformerSpati…

人文景区有必要做VR云游吗?如何满足游客出行需求?

VR云游在旅游行业中的应用正在快速增长&#xff0c;为游客带来沉浸式体验的同时&#xff0c;也为文旅景区提供了新的营销方式。很多人说VR全景展示是虚假的&#xff0c;比不上真实的景区触感&#xff0c;人文景区真的有必要做VR云游吗&#xff1f;我的答案是很有必要。 如果你认…

【vue3+pinia+Cookie】实现token登录及数据持久化

vue2后台登录项目,目前接触到的基本上都是vuex+本地存储或vuex+cookie或vuex+专门用于持久化vuex的库,如:vuex-persistedstate vuex默认情况下是在客户端内存中保存应用程序的状态,当页面刷新的时候,内存中的数据会丢失,导致vuex中的数据也会丢失。因为vuex的状态存储是临…

linux-删除KVM虚拟机

1.查看主机 #virsh list 2.关闭主机 #virsh shutdown 虚拟机名称 3.删除主机定义 #virsh undefine 虚拟机名称 4.删除KVM虚拟机文件 #find / -name 虚拟机名称 #rm -rf 虚拟机文件