Swagger之Hello World !

news2024/9/23 23:29:54

目录

■1.前言・Swagger介绍

■2.例子,如果基于Spring Boot项目,实现Swagger---非常简单

2.1.已有的SpringBoot项目

2.2.修改POM文件

2.3.添加Config文件

2.4.访问

2.5.访问效果以及对应的代码

效果

代码

2.6.类的标注

2.7.启动Log

2.8.xxx

2.9.xxx

■3.非Spring 项目中,Swagger的运用

3.0.Sping介绍

3.1.简介

3.2.SwaggerConfig

3.3.配置Swagger相关Bean

3.4.访问

3.5.对于非Spring工程,如何加载Swagger的配置类

3.6.Web工程,如何配置,能让一个类在服务启动的时候,被加载

方法1(最基本方法):

方法2:@WebListener

3.7.ServletContextListener


====

■1.前言・Swagger介绍

项目去IF设计书化,使用Swagger生成API接口。

先了解一下Swagger

Swagger是一组开源工具,用于设计、构建、文档化和测试RESTful API。它提供了一种基于JSON或YAML格式的API描述语言,可以定义API的操作、参数、响应和安全规范,并生成易于阅读和交互的API文档。Swagger还提供了一组可视化工具,包括Swagger UI和Swagger Editor,可以帮助开发人员快速构建和测试API。使用Swagger可以提高API的可读性、可维护性和交互性,从而促进API的开发和使用。

学习资料

官方文档:Swagger Documentation

Swagger Editor:Swagger Editor

Swagger UI:REST API Documentation Tool | Swagger UI

使用Swagger自动生成API文档:https://www.cnblogs.com/kevingrace/p/7883099.html

使用Swagger构建RESTful API:https://www.jianshu.com/p/9b1b75b4f3ea

Swagger入门教程:https://www.cnblogs.com/panpanwelcome/p/10094733.html

Swagger的使用及其原理简介:https://www.jianshu.com/p/a5f6e5e9f4cf

Spring Boot集成Swagger:https://www.jianshu.com/p/03c7b314d1f8

===

■2.例子,如果基于Spring Boot项目,实现Swagger---非常简单

2.1.已有的SpringBoot项目

SpringBoot + Thymeleaf 之 HelloWorld_sun0322的博客-CSDN博客

====

2.2.修改POM文件

	 <!--swagger依赖-->
	<dependency>
	    <groupId>io.springfox</groupId>
	    <artifactId>springfox-swagger2</artifactId>
	    <version>2.9.2</version>
	</dependency>
	<!--swagger ui-->
	<dependency>
	    <groupId>io.springfox</groupId>
	    <artifactId>springfox-swagger-ui</artifactId>
	    <version>2.9.2</version>
	</dependency>

===

2.3.添加Config文件

package com.sxz.test.one.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.common.base.Predicates;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class Swagger2Config {
    /**
     * 创建API应用
     * apiInfo() 增加API相关信息
     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
     * 指定扫描的包路径来定义指定要建立API的目录。
     * @return
     */
    @Bean
    public Docket coreApiConfig(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(adminApiInfo())
                .groupName("xxxApi")
                .select()
                //只显示user下面的路径
                .paths(Predicates.and(PathSelectors.regex("/user/.*")))
                .apis(RequestHandlerSelectors.basePackage("com.sxz"))
                .build();
    }

    private ApiInfo adminApiInfo(){
        return new ApiInfoBuilder()
                .title("XXXX--api文档")
                .description("My Spring boot Api 介绍。。。。。")
                .version("1.0")
                .contact(new Contact("zhangsan","https://blog.csdn.net/sxzlc","123456789@sun.com"))
                .build();
    }
}

===

2.4.访问

https://10.10.10.194/swagger-ui.html#/

===

2.5.访问效果以及对应的代码

效果

代码

package com.sxz.test.one.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.sxz.test.one.entity.User;
import com.sxz.test.one.service.UserService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;

@Api(value = "User Info")
@Controller
@RequestMapping("/user")
@Slf4j
public class UserController2 {

    @Autowired
    UserService userService;

    @ApiOperation(value = "All User Info",notes = "Find All User Info")
    @RequestMapping("/findAll2")
    public String findAll(
    		@ApiParam(value = "Model",required = true,example = "example model")
    		Model model){
    	
    	log.info("Hello World !-------!");
    	List<User> userList = userService.findAll();
    	model.addAttribute("userList",userList);
    	
    	return "helloThymeleafMyBatis.html";
    	
    }
}

xxx

2.6.类的标注

xxxx

在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,描述的主要来源是函数的命名,通常需要自己增加一些说明来丰富文档内容。

Swagger使用的注解及其说明:

@Api:用在类上,说明该类的作用。
@ApiOperation:注解来给API增加方法说明。
@ApiParam:定义在参数上
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
l code:数字,例如400
l message:信息,例如"请求参数没填好"
l response:抛出异常的类

@ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)

l @ApiModelProperty:描述一个model的属性

@ApiImplicitParams: 用在方法上包含一组参数说明。

@ApiImplicitParam:用来注解来给方法入参增加说明。

@ApiImplicitParam的参数说明:

paramType:指定参数放在哪个地方

header:请求参数放置于Request Header,使用@RequestHeader获取 query:请求参数放置于请求地址,使用@RequestParam获取 path:(用于restful接口)–>请求参数的获取:@PathVariable body:(不常用) form(不常用)

name:参数名

dataType:参数类型

required:参数是否必须传

true | false

value:说明参数的意思

defaultValue:参数的默认值

xxxx

2.7.启动Log

。。。。。。。

    [2023-07-31 19:04:20.990] [level: INFO] [Thread: main] [ Class:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext >> Method: prepareWebApplicationContext:285 ]
    INFO:Root WebApplicationContext: initialization completed in 5824 ms

    [2023-07-31 19:04:24.578] [level: INFO] [Thread: main] [ Class:springfox.documentation.spring.web.PropertySourcedRequestMappingHandlerMapping >> Method: initHandlerMethods:69 ]
    INFO:Mapped URL path [/v2/api-docs] onto method [springfox.documentation.
swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)]

    [2023-07-31 19:04:24.889] [level: INFO] [Thread: main] [ Class:org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor >> Method: initialize:181 ]
    INFO:Initializing ExecutorService 'applicationTaskExecutor'

    [2023-07-31 19:04:25.143] [level: INFO] [Thread: main] [ Class:org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping >> Method: <init>:53 ]
    INFO:Adding welcome page: class path resource [static/index.html]

。。。。。。。

2.8.xxx

xxxx

2.9.xxx

xxxx

===

■3.非Spring 项目中,Swagger的运用

3.0.Sping介绍

Spring Boot,Sprint Batch,ThymeLeaf 学习_sun0322的博客-CSDN博客

xxxx

3.1.简介

Swagger是一种用于创建、文档化和测试Restful API的工具,不限于特定的框架或工程。即使你的web工程不是基于Spring或Spring Boot的,你仍然可以使用Swagger来实现API文档化和测试。

如果你的web工程不是基于Spring或Spring Boot的,你可以使用Swagger2配置Swagger,提供API文档化和测试的功能。下面给出一个示例配置:

xxxx

3.2.SwaggerConfig

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.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
   
   public Docket api() {
      return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.api")) // 修改为你的API接口所在的包路径
            .paths(PathSelectors.any())
            .build()
            .apiInfo(apiInfo());
   }

   private ApiInfo apiInfo() {
      return new ApiInfoBuilder()
            .title("API文档")
            .description("描述你的API")
            .version("1.0")
            .build();
   }
}

xxxx

3.3.配置Swagger相关Bean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

   @Bean
   public SwaggerConfig swaggerConfig() {
      return new SwaggerConfig();
   }
}

===

3.4.访问

启动工程并访问Swagger UI:当你的工程启动后,你可以通过访问Swagger UI来查看生成的API文档。Swagger UI的访问地址一般是http://localhost:port/swagger-ui.html,其中port是你的web应用的端口号。

==

需要注意的是,以上示例代码是以Java配置的方式示范,如果你的工程使用其他配置方式(如XML配置),你需要相应地进行调整。

==

以上是一个基本的Swagger2配置示例,通过在工程中配置Swagger,你可以实现API文档化和测试的功能。具体的配置细节可能会因为工程的不同而有所差异,你可以根据Swagger官方文档或相关的API文档进行调整和修改。

xxxx

3.5.对于非Spring工程,如何加载Swagger的配置类

对于非Spring工程,如果你想要让程序加载Swagger的配置类

public class MainClass {
   public static void main(String[] args) throws Exception {
      Class<?> swaggerConfigClass = Class.forName("你的包名.SwaggerConfig"); // 修改为SwaggerConfig类所在的包名
   }
}

xxx

调用SwaggerConfig类的api()方法:通过反射调用SwaggerConfig类中的api()方法来获取Docket对象。

public class MainClass {
   public static void main(String[] args) throws Exception {
      Class<?> swaggerConfigClass = Class.forName("你的包名.SwaggerConfig"); // 修改为SwaggerConfig类所在的包名

      Object swaggerConfigObject = swaggerConfigClass.newInstance();

      Method apiMethod = swaggerConfigClass.getDeclaredMethod("api");

      Docket docket = (Docket) apiMethod.invoke(swaggerConfigObject);
   }
}

使用Docket对象进行Swagger的配置和初始化。

public class MainClass {
   public static void main(String[] args) throws Exception {
      Class<?> swaggerConfigClass = Class.forName("你的包名.SwaggerConfig"); // 修改为SwaggerConfig类所在的包名

      Object swaggerConfigObject = swaggerConfigClass.newInstance();

      Method apiMethod = swaggerConfigClass.getDeclaredMethod("api");

      Docket docket = (Docket) apiMethod.invoke(swaggerConfigObject);

      // 根据你的实际需求,进行其他的Swagger配置(例如设置路径,设置API文档信息等)

      // 初始化Swagger
      Swagger swagger = docket.initialize();

      // 可以根据需要将Swagger对象保存下来,供其他需要使用Swagger的地方使用
   }
}

sss

以上是在非Spring工程中手动加载Swagger配置类的方法,你可以根据实际情况进行调整。需要注意的是,这种方式需要手动处理加载和初始化,相对于Spring工程中的自动注入来说,比较繁琐。如果你的项目是非常简单的项目,也可以考虑使用Spring或Spring Boot来简化Swagger的配置和集成。

3.6.Web工程,如何配置,能让一个类在服务启动的时候,被加载

方法1(最基本方法):

首先,创建一个类实现javax.servlet.ServletContextListener接口并重写contextInitialized方法,该方法会在Web应用启动时被调用。在该方法中,你可以执行你想要在服务启动时加载的逻辑。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListener implements ServletContextListener {
   @Override
   public void contextInitialized(ServletContextEvent servletContextEvent) {
      // 这里写你想要在服务启动时加载的逻辑
   }

   @Override
   public void contextDestroyed(ServletContextEvent servletContextEvent) {
      // 服务关闭时的逻辑
   }
}

然后,在web.xml中配置该监听器。找到web.xml文件,添加以下代码:

<listener>
   <listener-class>你的包名.MyServletContextListener</listener-class> <!-- 修改为你的类的全限定名 -->
</listener>

xxx

当你的Web应用启动时,MyServletContextListener类的contextInitialized方法将会被调用,在该方法中可以执行你想要在服务启动时加载的逻辑。

===

方法2:@WebListener

注意:在最新的Servlet规范和Servlet 3.0之后,你还可以使用注解的方式配置ServletContextListener你可以在想要加载的类上添加@WebListener注解,并将其放置在类上方。

xxx

import javax.servlet.annotation.WebListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

@WebListener
public class MyServletContextListener implements ServletContextListener {
   @Override
   public void contextInitialized(ServletContextEvent servletContextEvent) {
      // 这里写你想要在服务启动时加载的逻辑
   }

   @Override
   public void contextDestroyed(ServletContextEvent servletContextEvent) {
      // 服务关闭时的逻辑
   }
}

这种方式更简洁,并且不需要在web.xml中进行配置。

无论是使用web.xml配置还是使用注解配置ServletContextListener,都可以达到在Web服务启动时加载某个类的目的。

xxx

3.7.ServletContextListener

 ===

 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.

package javax.servlet;

import java.util.EventListener;

/** 
 * Interface for receiving notification events about ServletContext
 * lifecycle changes.
 *
 * <p>In order to receive these notification events, the implementation
 * class must be either declared in the deployment descriptor of the web
 * application, annotated with {@link javax.servlet.annotation.WebListener},
 * or registered via one of the addListener methods defined on
 * {@link ServletContext}.
 *
 * <p>Implementations of this interface are invoked at their
 * {@link #contextInitialized} method in the order in which they have been
 * declared, and at their {@link #contextDestroyed} method in reverse
 * order.
 *
 * @see ServletContextEvent
 *
 * @since Servlet 2.3
 */
public interface ServletContextListener extends EventListener {

    /**
     * Receives notification that the web application initialization
     * process is starting.
     *
     * <p>All ServletContextListeners are notified of context
     * initialization before any filters or servlets in the web
     * application are initialized.
     *
     * @param sce the ServletContextEvent containing the ServletContext
     * that is being initialized
     */
    public void contextInitialized(ServletContextEvent sce);

    /**
     * Receives notification that the ServletContext is about to be
     * shut down.
     *
     * <p>All servlets and filters will have been destroyed before any
     * ServletContextListeners are notified of context
     * destruction.
     *
     * @param sce the ServletContextEvent containing the ServletContext
     * that is being destroyed
     */
    public void contextDestroyed(ServletContextEvent sce);
}

 xxx

===

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

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

相关文章

html请求谷歌音频跨域问题(谷歌翻译接口)虚拟机ping不通google(下载谷歌音频、下载百度翻译音频)

文章目录 调用谷歌翻译接口&#xff0c;尝试了几种方案&#xff0c;都提示跨域不行第一种&#xff08;通过js代码获取音频文件的Blob对象&#xff0c;提示跨域了&#xff09;代码结果 第二种&#xff08;尝试新窗打开音频url&#xff0c;404&#xff0c;估计也是跨域了&#xf…

StarRocks Friends 广州站精彩回顾

上周六&#xff0c;StarRocks & Friends 活动在羊城广州成功举行&#xff0c;社区的小伙伴齐聚一堂&#xff0c;共同探讨了 StarRocks 在业界的应用实践和湖仓一体等热门话题。 本文总结了技术交流活动的关键内容和视频资料&#xff0c;感谢社区每一位小伙伴的支持和参与&…

如何提高接口测试覆盖率?

接口测试是测试系统组件间接口的一种测试。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试该如何提高测试的覆盖率呢&#…

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二)

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二) 一、算法简介二、实现代码三、效果展示一、算法简介 对于空间中的这样一组点:大致呈直线分布,散乱分布在直线左右, 我们可采用最小二乘方法拟合直线,更进一步地,可以通过点到直线的投影,最终得到一组严格呈直线分布…

软件测试一周面试十家公司,分享面试经历

从开始面试讲起&#xff0c;公司规模我分成5类&#xff1a;创业公司0-20人&#xff0c;小型公司20-40人&#xff0c;中小型50-99&#xff0c;中型公司100-499即将上市的那种&#xff0c;已上市公司100-499。 创业公司 第一个面试的那家创业公司特别坑&#xff0c;开始面试&am…

4年测试“我“该何去何从?测试还是测试开发?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 4年测试&#xff…

秋招备战笔试Day2

目录 单选 1.A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 2.下面代码将输出什么内容&#xff1a;&#xff08;&#xff09; 3.阅读如下代码。 请问&#xff0c;对语句行 test.hello(). 描述正确的有&#xff08;&…

vlan access, trunk, hybrid (tagged/untagged) 笔记

vlan 接口和配置 PVID&#xff08;port vlan ID&#xff09; 定义 pvid 主要目的&#xff1a; 当交换机接口收到没有 vlan tag 标签的包时&#xff0c;接口会将定义的 pvid 作为当前包的 vlan id。当对映 pvid vlan 的包&#xff0c;通过当前交换机接口发出时&#xff0c;接…

ADSelfService Plus:保护密码安全的最佳解决方案

密码安全是当今数字时代中至关重要的话题。随着互联网和信息技术的迅速发展&#xff0c;我们的生活变得越来越数字化&#xff0c;密码已成为我们生活中不可或缺的一部分。然而&#xff0c;随着各种网络威胁和黑客攻击不断增加&#xff0c;保护我们的密码变得越来越重要。 密码安…

测试工程师刚入职如何快速熟悉需求并输出测试用例?

刚入职第一天&#xff0c;早上办完入职&#xff0c;下午就就分配了测试任务&#xff0c;2个模块13条短信验证&#xff0c;2天内输出测试用例&#xff08;xmind输出功能点&#xff0c;excel书写业务流&#xff09;。测试负责人给我们快速讲了一下业务&#xff0c;在这过程中大概…

openssl/bn.h: No such file or directory

报错截图 解决方法 ubuntu apt install libssl-dev -y centos yum install openssl-devel -y

echarts实现多层环图(复制粘贴即可)

data里面参数配置&#xff1a; // 多重环图optionCircle: {tooltip: {show: false,trigger: item,formatter: "{a} : {c} ({d}%)"},color: [#3AB1EB, #D48B6A, #5B41C8, #FE7E02],legend: {orient: horizontal,itemWidth: 30, // 图例标记的图形宽度。itemHeight…

从产品和运营的角度聊聊,如何有效吸引与引导用户注册转化?

从产品和运营的角度聊聊 如何有效吸引与引导用户注册转化&#xff1f; 正文共&#xff1a;4360字 23图 预计阅读时间&#xff1a;11分钟 1 如何进行改版&#xff0c;找找思路&#xff1f; 前段时间在做公司的网站改版策划&#xff0c;此前接触的都是一些ToB的解决方案提供商…

Jmeter脚本录制:抓取IOS手机请求包

现在移动端的项目越来越多&#xff0c;今天给大家介绍一下&#xff0c;在IOS下Jmeter如何抓包。 1、电脑连上wifi 2、Jmeter中配置“HTTP代理服务器” 1)启动Jmeter&#xff1b;2)“测试计划”中添加“线程组”&#xff1b;3)“测试计划”中添加“HTTP代理服务器”&#xff…

【算法很美】多维数组和字符串篇打卡(第三天)

文章目录 子矩阵的最大累加和整体代码 矩阵运算-乘法整体代码 检测字符串是否有重复字符整体代码 反转字符串整体代码 变形词整体代码 替换字符串中的空格整体代码 子矩阵的最大累加和 整体代码 package 每日算法学习打卡.算法打卡.七月份.七月三十一号;import java.util.Arra…

nginx配置访问本机文件夹里的静态资源404

在nginx中配置了location访问一直404 location /web/user/ { alias /home/user/wlds/user/;index index.html;try_files $uri $uri/ /index.html 404;} 看日志发现Permission denied 因为是直接使用的yum安装的二进制包nginx&#xff0c;nginx.conf文件首行是user nginx;所以没…

【DRAM存储器三】内存颗粒内部结构

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR4数据手册》 目录 DDR4颗粒的内部结构 …

[SSM]Spring6整合JUnit5与集成MyBatis3.5

目录 十七、Spring6整合JUnit5 17.1Spring对JUnit4的支持 17.2Spring对JUnit5的支持 十八、Spring6集成MyBatis3.5 18.1实现步骤 18.2具体实现 18.3spring配置文件的import 十七、Spring6整合JUnit5 17.1Spring对JUnit4的支持 准备工作&#xff1a; <dependencies&…

python——案例四:判断字符串中的元素组成

案例四&#xff1a;判断字符串中的元素组成str"Hello World! 666" print(str.isalnum()) #判读所有的字符都是数字或者是字母 print(str.isalpha()) #判读所有的字符都是字母 print(str.isdigit()) #判读所有的字符都是数字 print(str.islower()) #判读所有的字符都是…