Swagger原理

news2024/11/25 2:25:06

最近在基于Swagger进行二次开发, 来对项目的接口进行管理,功能实现了,但是不清楚swagger的工作原理,为了后续能更好利用Swagger来管理接口,而且能借鉴Swagger的原理,将项目中其他信息可视化展示,决定DebugSwagger的流程。版本使用的是springdoc-openapi,并不是旧版的swagger,但是口语上还是用swagger表示。

Swagger使用分两个阶段,第一个阶段是注册一些Bean,初始化一些配置。第二阶段是页面访问、接口调用,将数据填充到HTML页面展示在浏览器上。

注册静态资源

WebMvcConfigurationSupport类会实例化HandlerMapping这个Bean

在这里插入图片描述

实例化过程中,将所有的WebMvcConfigurer中定义的ResourceHandler放到ResourceHandlerRegistry中去。所有的WebMvcConfigurer包括系统默认的和自定义的,其中和Swagger相关的就是WebMvcAutoConfiguration类的内部类WebMvcAutoConfigurationAdapter中注册的ResourceHandler,处理的URL是/webjars/**,locations是classpath:/META-INF/resources/webjars/

在这里插入图片描述

另外一个和Swagger相关的是SwaggerWebMvcConfigurer,里面会处理/swagger-ui*/**路径,locations是classpath:/META-INF/resources/webjars/

在这里插入图片描述

在这里插入图片描述

ResourceHandlerRegistry注册完后,会调用ResourceHandlerRegistrygetHandlerMapping方法,实例化AbstractHandlerMapping

在这里插入图片描述

在这里插入图片描述

对于Swagger静态资源,对应的是ResourceHttpRequestHandler。还需要注意到,最后生成AbstractHandlerMappingSimpleUrlHandlerMapping,这在后面请求时会用到。

访问Swagger静态资源

首先访问Swagger首页地址,/swagger-ui/index.html,进入DispatcherServletdoDispatch方法,根据Request对象获取mappedHandler

在这里插入图片描述

getHandler方法里面就是从不同的handlerMappings中获取HandlerExecutionChain,实际走的就是SimpleUrlHandlerMapping

在这里插入图片描述

SimpleUrlHandlerMappinggetHandler方法里看,最终是在SimpleUrlHandlerMapping父类AbstractUrlHandlerMappinglookupHandler方法中,根据URL匹配出ResourceHttpRequestHandler,构造成HandlerExecutionChain对象返回。

在这里插入图片描述

再往下根据mappedHandler获取HandlerAdapter,实际获取到的就是HttpRequestHandlerAdapter

在这里插入图片描述

在这里插入图片描述

接着就会调用HttpRequestHandlerAdapterhandler方法,handler方法会将请求交给HttpRequestHandlerhandleRequest方法,最终是交给ResourceHttpRequestHandlerhandleRequest方法。在该方法中,首先就是获取Resource对象。

在这里插入图片描述

实际上是通过DefaultResourceResolverChain里面的WebJarsResourceResolverPathResourceResolver得到最终的Resource对象,首先是将swagger-ui/index.html通过WebJarsResourceResolver转成swagger-ui/4.14.0/index.html,在将转化后的URL通过PathResourceResolver解析出Resource对象。

在这里插入图片描述

Swagger的静态资源是在org.webjars:swagger-ui:4.14.0中resources目录下

在这里插入图片描述

最后是将Resource对象的内容,写入HttpServletResponse中返回。

访问Swagger Rest接口

访问Swagger首页时,除了一些静态资源如htmlcssjsSwagger还会访问/v3/api-docs/开头的后台Rest接口,这些接口会返回数据供页面使用,共同实现Swagger的功能。

在这里插入图片描述

像上图的swagger-config接口完整路径是/v3/api-docs/swagger-config,这个接口是在SwaggerConfigResource类中定义的。功能就是获取所有的group和对应的URL。

下面主要介绍另外一个接口,/v3/api-docs/{group},这个接口是根据group名称获取该组下的所有接口。

接口定义是这样的

在这里插入图片描述

首先获取OpenApiResource对象,实际获取的是OpenApiWebMvcResource对象

在这里插入图片描述

接着调用openapiJson方法,最终调用的是AbstractOpenApiResourcegetOpenApi方法

在这里插入图片描述

这个方法就是主要扫描接口的方法了,在openAPIService.build(finalLocale)那一句,就是扫描Controller的接口

在这里插入图片描述

当然还有其他处理,处理参数、返回值、执行一些自定义的customisers等等(后面有时间再每一步进去看下是Swagger是如何解析接口、请求数据、返回值的),最终返回一个OpenAPI对象,然后以Json格式的字符串返回给前端。

OpenAPI这个实体类的结构如下,从官网截取部分,以便理解,有了这个结构,可以自定义一些OpenApiCustomiser,对OpenAPI对象进行改动,进行二次开发,实现一些自定义功能。

openapi: 3.0.3
info:
  title: Swagger Petstore - OpenAPI 3.0
  description: |-
    This is a sample Pet Store Server based on the OpenAPI 3.0 specification.  You can find out more about
    Swagger at [https://swagger.io](https://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!
    You can now help us improve the API whether it's by making changes to the definition itself or to the code.
    That way, with time, we can improve the API in general, and expose some of the new features in OAS3.
  termsOfService: http://swagger.io/terms/
  contact:
    email: apiteam@swagger.io
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: 1.0.11
externalDocs:
  description: Find out more about Swagger
  url: http://swagger.io
servers:
  - url: https://petstore3.swagger.io/api/v3
tags:
  - name: pet
    description: Everything about your Pets
    externalDocs:
      description: Find out more
      url: http://swagger.io
  - name: store
    description: Access to Petstore orders
    externalDocs:
      description: Find out more about our store
      url: http://swagger.io
paths:
  /pet:
    put:
      tags:
        - pet
      summary: Update an existing pet
      description: Update an existing pet by Id
      operationId: updatePet
      requestBody:
        description: Update an existent pet in the store
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
          application/xml:
            schema:
              $ref: '#/components/schemas/Pet'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Pet'
        required: true
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'          
            application/xml:
              schema:
                $ref: '#/components/schemas/Pet'
        '400':
          description: Invalid ID supplied
        '404':
          description: Pet not found
        '405':
          description: Validation exception
      security:
        - petstore_auth:
            - write:pets
            - read:pets
    post:
      tags:
        - pet
      summary: Add a new pet to the store
      description: Add a new pet to the store
      operationId: addPet
      requestBody:
        description: Create a new pet in the store
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
          application/xml:
            schema:
              $ref: '#/components/schemas/Pet'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Pet'
        required: true
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'          
            application/xml:
              schema:
                $ref: '#/components/schemas/Pet'
        '405':
          description: Invalid input
      security:
        - petstore_auth:
            - write:pets
            - read:pets

总结

流程还是比较清晰,Swagger提供一些Jar包,包含Rest接口和静态资源,应用启动时先注册静态资源、确定访问的URL,访问Swagger首页时,通过SpringMVC将Jar包中的静态资源取出,静态资源中请求后台Rest接口,由后台接口解析项目的Controller接口,返回接口信息给前端展示在页面上。

写这篇文章除了介绍Swagger原理,在Swagger基础上进行二次开发,另外一个目的就是是借鉴这种设计思路,和项目相关的信息可视化展示。比如项目脚本数据和数据表结构变更记录、Git文件提交记录等等。

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

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

相关文章

什么是测试驱动开发?测试驱动开发有什么优点?

目录 前言 什么是TDD或测试驱动开发? 什么是软件单元测试? 什么是TDD? 测试驱动开发的好处 最后的想法 前言 测试是任何软件开发项目中最重要的步骤之一。如果跳过此过程,则结果可能是灾难性的-对项目和公司而言。但是什么时…

K8s in Action 阅读笔记——【11】Understanding Kubernetes internals

K8s in Action 阅读笔记——【11】Understanding Kubernetes internals 11.1 Understanding the architecture Kubernetes集群分为两个部分: k8s控制平面工作节点 控制平面的组件 构成控制平面的组件有: etcd:etcd是一个分布式的持久化键…

javascrip基础二十八:说说函数节流和防抖?有什么区别?如何实现?

一、是什么 本质上是优化高频率执行代码的一种手段 如:浏览器的 resize、scroll、keypress、mousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能 为了优化体验,需要对这类事…

类与对象知识总结+构造函数和析构函数 C++程序设计与算法笔记总结(二) 北京大学 郭炜

类和对象 结构化程序设计 C语言使用结构化程序设计: 程序 数据结构 算法 程序由全局变量以及众多相互调用的函数组成。 算法以函数的形式实现,用于对数据结构进行操作。 结构化程序设计的不足: 结构化程序设计中,函数和其所…

《嵌入式系统》知识总结11:STM32串口

串行通信vs并行通信 • 并行:使用8根数据线一次传送一个字节(或使用16根数据线一次传送2个字节,...) • 串行:使用少量数据信号线(8根以下),将数据逐位分时传送 • 并行vs串行&…

路径规划算法:基于秃鹰优化的路径规划算法- 附代码

路径规划算法:基于秃鹰优化的路径规划算法- 附代码 文章目录 路径规划算法:基于秃鹰优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法秃鹰…

【三维编辑】Removing Objects From Neural Radiance Fields论文解读

题目:Removing Objects From NeRF 从神经辐射场中移除对象 论文:https://arxiv.org/abs/2212.11966 作者:Silvan Weder,Guillermo Niantic, ETH Zurich, University College London, nianticlabs.github.ionerf-object-removal 文章目录 摘要一、前言二、…

Batch Normalization原理

首先我们提出一个问题,为什么要有Batch Normalization这样神奇的操作?原有的深度神经网络是有什么问题吗? 还真有问题,那就要提到各位炼丹师们的困境,在深度学习中,模型的层数往往非常的巨大,尤…

SpringBootWeb AOP(下)

3. AOP进阶 AOP的基础知识学习完之后,下面我们对AOP当中的各个细节进行详细的学习。主要分为4个部分: 通知类型通知顺序切入点表达式连接点 我们先来学习第一部分通知类型。 3.1 通知类型 在入门程序当中,我们已经使用了一种功能最为强大…

磁盘配额与进阶文件系统管理(二)

逻辑卷管理(Logical Volume Manager) 简介:lvm可以弹性调节filesystem容量;lvm可以整合多个实体partion在一起,使得多个partion看起来像一个磁盘。 LVM基本概念 PV:物理卷 PE:实体范围区块 VG:卷组 …

前端食堂技术周刊第 85 期:5 月浏览器更新、TypeScript 5.1、Rspack 0.2.0、Parcel v2.9.0、Next.js 企业级模板

美味值:🌟🌟🌟🌟🌟 口味:龙井酥 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 5 月登陆浏览器的新功能TypeScript 5.1Rspack 0.2.0Parcel v2.9.0Next.js 企…

DINO代码学习笔记(四)

DINO代码学习笔记(一)中已经将输入transformer之前的参数处理给捋了一遍 DINO代码学习笔记(二)中将encoder部分给捋了一遍 DINO代码学习笔记(三)中将decoder部分给捋了一遍,以上将DINO的主体部…

聊一聊Spring Security的那些事

一.什么是Spring Security S[ing Security是一个基于Java EE框架Spring的安全性框架,它提供了身份认证和授权功能,用于保护应用程序中的资源。同时,它也支持许多常见的身份验证机制,并提供了预防常见攻击,如跨站请求伪…

[230603]托福听力精听|TPO66C2|Financial Advice

tuition bill 学费 add up 加总 allowance 补贴 budget 预算 document 文件 expense 费用;开销 semester 学期 dorm 宿舍 own 拥有;自己的 bulletin board…

SpringCloud微服务架构 --- 基础篇

一、认识微服务 1.1、服务架构演变 1.1.1、单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。 单体架构的优缺点如下: 优点: 架构简单部署成本低 缺点: 耦合度高(维护困难、…

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(一)

引言:从本文开始,我们介绍下项目中设计的并行LVDS高速DAC接口设计,包括DAC与FPGA硬件接口设计、软件设计等。项目设计高速DAC采用了ADI公司的AD9129,该芯片最大更新速率5.7Gsps,该芯片在宽带通信应用、LTE、雷达信号产…

wpf中使用svg图片

在wpf中,svg图片不能直接使用,但是我们知道,svg图片比png,jpg等图片都好点,原因就是它是矢量图片,不会变形。 一共4种方式: 第一种: 简单的svg,我们可以使用path来装载…

算法与数据结构(三)

一、堆 1,堆结构就是用数组实现的完全二叉树结构 根节点的左孩子的下标为:2i1,右孩子为2i2。两个孩子的父节点为(i-1)/2向下取整 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 从下往上将孩子与父节点进行比较,如果子叶…

【Docker】什么是Docker,它用来干什么

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

使用Leangoo轻量敏捷看板工具实现多泳道任务管理

在敏捷开发的实践当中,通过可视化的敏捷任务看板来实现团队协同和透明化管理是必不可少的一个实践。 通过可视化的敏捷任务看板我们可以达到如下几个目的: 1. 可视化管理团队的目标; 2. 明确目标的优先级; 3. 明确目标分解后的任务项; 4. 可视化管理任…