Swagger的原理及应用详解(七)

本系列文章简介:

        在当今快速发展的软件开发领域,特别是随着微服务架构和前后端分离开发模式的普及,API(Application Programming Interface,应用程序编程接口)的设计与管理变得愈发重要。一个清晰、准确且易于理解的API文档不仅能够提升开发效率,还能促进前后端开发者之间的有效沟通,减少因文档不一致或缺失导致的错误和返工。然而,传统的手写API文档方式往往存在更新不及时、易出错、难以维护等问题。

        正是在这样的背景下,Swagger应运而生,它作为一款强大的API文档自动生成工具,极大地简化了API文档的编写和管理工作。Swagger通过扫描代码中的注解,自动生成详细的API文档,并支持在线测试,使得开发者可以直观地看到API的请求参数、响应结果以及可能的错误码等信息。

        本系列文章旨在深入解析Swagger的原理核心组件应用场景以及搭建配置等关键内容,帮助大家全面了解并高效利用Swagger这一工具。我们将从Swagger的概述开始,逐步深入到其工作原理、核心组件的详细介绍,以及在不同开发场景下的应用实践。同时,我们还将探讨Swagger在前后端分离开发、API文档管理、API测试与调试等方面的实际应用,以及如何解决在使用过程中遇到的一些常见问题。

        通过本系列文章的学习,大家将能够掌握Swagger的基本使用方法,理解其背后的技术原理,并能够根据项目的实际需求灵活运用Swagger来提升API文档的质量和开发效率。此外,本文还将提供一些学习资源和最佳实践,帮助大家进一步提升在API设计和文档管理方面的能力。

        总之,Swagger作为一款优秀的API文档自动生成工具,在软件开发领域具有广泛的应用前景和重要的实用价值。希望通过本系列文章的详细解析和介绍,能够为大家在API文档的编写和管理工作中提供有力的支持和帮助。

        欢迎大家订阅《Java技术栈高级攻略》专栏(PS:近期会涨价),一起学习,一起涨分!

目录

一、引言

二、Swagger的搭建与配置

2.1 环境准备

2.1.1 Maven或Gradle项目搭建

2.1.2 设置API的标题、版本、描述等信息

2.2 使用Swagger注解

2.2.1 在Controller和实体类上使用Swagger注解

2.2.2 编写API文档说明

三、Swagger的进阶使用

3.1 自定义Swagger UI

3.2 Swagger与Spring Boot集成

3.3 Swagger与其他框架的集成

四、常见问题与解决方案

4.1 Swagger UI无法访问

4.2 生成的API文档不准确

4.3 Swagger性能优化

五、总结与展望

六、结语


一、引言

        Swagger(OpenAPI Specification)是一个功能强大的框架和规范,它通过自动化生成文档、提供详细的API描述以及支持调用和可视化等功能,极大地简化了API的设计、构建、使用和理解过程。无论是在企业内部还是跨企业的API合作中,Swagger都发挥着重要的作用。

        本文将跟随《Swagger的原理及应用详解(六)》的进度,继续介绍Swagger。希望通过本系列文章的学习,您将能够更好地理解Swagger的内部工作原理,掌握Swagger的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Swagger的潜力,为系统的高效运行提供有力保障。

二、Swagger的搭建与配置

2.1 环境准备

2.1.1 Maven或Gradle项目搭建

Swagger的搭建与配置在Maven或Gradle项目中是一个相对直接的过程,主要涉及引入依赖、配置Swagger以及(可选地)在Controller中使用Swagger注解。以下是详细的步骤说明:

Maven项目搭建Swagger

1. 引入Swagger依赖

在Maven项目的pom.xml文件中,添加Swagger的依赖项。为了保持兼容性,建议使用经过验证的稳定版本,如2.9.2


	<dependencies> 

	<!-- Swagger2核心包 --> 

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

	</dependencies>

 

2. 配置Swagger

创建一个配置类,用于配置Swagger的详细信息,如API信息、扫描的包等。在该类上添加@Configuration@EnableSwagger2注解。


	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.spi.DocumentationType; 

	import springfox.documentation.spring.web.plugins.Docket; 

	import springfox.documentation.swagger2.annotations.EnableSwagger2; 

	


	@Configuration 

	@EnableSwagger2 

	public class SwaggerConfig { 

	


	@Bean 

	public Docket api() { 

	return new Docket(DocumentationType.SWAGGER_2) 

	.select() 

	.apis(RequestHandlerSelectors.basePackage("com.example.controller")) // 指定扫描的包 

	.paths(PathSelectors.any()) // 扫描所有路径 

	.build() 

	.apiInfo(apiInfo()); 

	} 

	


	private ApiInfo apiInfo() { 

	return new ApiInfoBuilder() 

	.title("API Documentation") 

	.description("Documentation for my API") 

	.version("1.0") 

	.build(); 

	} 

	}

3. (可选)在Controller中使用Swagger注解

在Controller类和方法上使用Swagger的注解来丰富API文档的信息。


	import io.swagger.annotations.Api; 

	import io.swagger.annotations.ApiOperation; 

	import org.springframework.web.bind.annotation.GetMapping; 

	import org.springframework.web.bind.annotation.RestController; 

	


	@RestController 

	@Api(value = "测试接口Controller", description = "测试接口说明") 

	public class TestController { 

	


	@GetMapping("/test") 

	@ApiOperation(value = "测试接口", notes = "这是一个测试接口") 

	public String test() { 

	return "Hello, Swagger!"; 

	} 

	}

4. 访问Swagger UI

启动Spring Boot应用后,通过浏览器访问http://localhost:8080/swagger-ui.html(端口号可能因配置而异)来查看Swagger UI界面。

Gradle项目搭建Swagger

1. 引入Swagger依赖

在Gradle项目的build.gradle文件中,添加Swagger的依赖项。


	dependencies { 

	implementation 'io.springfox:springfox-swagger2:2.9.2' 

	implementation 'io.springfox:springfox-swagger-ui:2.9.2' 

	}

2. 配置Swagger

与Maven项目类似,创建一个配置类来配置Swagger。


	// 配置类代码与Maven项目中的SwaggerConfig类相同

 

3. (可选)在Controller中使用Swagger注解

与Maven项目相同,在Controller中使用Swagger注解来丰富API文档的信息。

4. 访问Swagger UI

启动Spring Boot应用后,通过浏览器访问http://localhost:8080/swagger-ui.html(端口号可能因配置而异)来查看Swagger UI界面。

总结

无论是在Maven还是Gradle项目中搭建Swagger,主要步骤都包括引入依赖、配置Swagger以及(可选地)在Controller中使用Swagger注解。通过这些步骤,可以方便地生成和查看RESTful API的文档,并提供接口测试的功能。


2.1.2 设置API的标题、版本、描述等信息

在Swagger中,你可以通过配置Swagger的Docket Bean来设置API的标题、版本、描述等信息。这些设置通常是在你的Swagger配置类中完成的,该类通过@Configuration@EnableSwagger2注解来启用Swagger。

以下是一个示例,展示了如何设置API的标题、版本和描述等信息:

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.spi.DocumentationType;  
import springfox.documentation.spring.web.plugins.Docket;  
import springfox.documentation.swagger2.annotations.EnableSwagger2;  
  
@Configuration  
@EnableSwagger2  
public class SwaggerConfig {  
  
    @Bean  
    public Docket api() {  
        return new Docket(DocumentationType.SWAGGER_2)  
                .select()  
                // 指定扫描的包  
                .apis(RequestHandlerSelectors.basePackage("com.yourcompany.project.controller"))  
                // 扫描所有路径  
                .paths(PathSelectors.any())  
                .build()  
                // 设置API信息  
                .apiInfo(apiInfo());  
    }  
  
    private ApiInfo apiInfo() {  
        // 返回一个ApiInfo实例,用于定制API信息  
        return new ApiInfoBuilder()  
                // API标题  
                .title("Your API Title")  
                // API描述  
                .description("A detailed description of your API")  
                // 版本号  
                .version("1.0.0")  
                // 许可信息(可选)  
                .license("Apache 2.0")  
                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")  
                .build();  
    }  
}

 

在这个例子中,apiInfo()方法创建了一个ApiInfo实例,该实例包含了API的标题、描述、版本以及许可信息(如果适用)。这些信息会被Swagger UI用来显示API的概览信息。

  • title:API的标题,显示在Swagger UI的顶部。
  • description:API的详细描述,通常包含API的用途、功能等信息。
  • version:API的版本号,有助于区分不同版本的API。
  • licenselicenseUrl:API的许可信息和许可URL(可选),这些信息对于开源项目尤其有用。

配置完成后,当你访问Swagger UI时(通常是http://localhost:8080/swagger-ui.html,端口号可能因你的配置而异),你就可以在页面的顶部看到这些API信息了。

2.2 使用Swagger注解

2.2.1 在Controller和实体类上使用Swagger注解

在Swagger中,使用注解来丰富API文档的信息是一种非常直接和有效的方法。Swagger提供了多种注解,可以在Controller(控制器)和实体类(Model)上使用,以提供更详细的API描述、参数说明、响应信息等。以下是一些常用的Swagger注解及其在Controller和实体类上的使用示例。

在Controller上使用Swagger注解

  1. @Api:用于标记当前类是一个Swagger资源(API),并可以指定一些元数据信息,如tags。
import io.swagger.annotations.Api;  
import io.swagger.annotations.ApiOperation;  
  
@RestController  
@RequestMapping("/api/v1/users")  
@Api(tags = "用户管理")  
public class UserController {  
    // ...  
}

        2. @ApiOperation:用于标记一个方法(通常是Controller中的一个方法)的操作,可以指定操作的描述、HTTP方法、响应类型等信息。

 

import io.swagger.annotations.ApiOperation;  
  
@GetMapping("/{id}")  
@ApiOperation(value = "根据ID获取用户信息", notes = "返回指定ID的用户详细信息")  
public ResponseEntity<User> getUserById(@PathVariable Long id) {  
    // ...  
}

        3. @ApiParam:用于标记方法参数,可以指定参数的名称、描述等信息。

import io.swagger.annotations.ApiParam;  
  
@PostMapping  
@ApiOperation(value = "创建新用户")  
public ResponseEntity<User> createUser(@ApiParam(value = "用户对象", required = true) @RequestBody User user) {  
    // ...  
}

        4. @ApiResponses 和 @ApiResponse:用于描述方法可能的响应。@ApiResponses 可以包含多个 @ApiResponse

import io.swagger.annotations.ApiResponses;  
import io.swagger.annotations.ApiResponse;  
  
@PostMapping  
@ApiOperation(value = "更新用户信息")  
@ApiResponses({  
    @ApiResponse(code = 200, message = "更新成功"),  
    @ApiResponse(code = 404, message = "用户未找到")  
})  
public ResponseEntity<Void> updateUser(@RequestBody User user) {  
    // ...  
}

 

在实体类上使用Swagger注解

虽然Swagger的注解主要用于Controller层,但实体类(Model)上的某些Java标准注解(如@JsonProperty@JsonIgnore等)也会间接影响Swagger生成的文档。不过,Swagger也提供了一些特定的注解来丰富Model的描述。

  1. @ApiModel:用于描述一个Model的信息(一般用于类上),如描述、名称等。
import io.swagger.annotations.ApiModel;  
  
@ApiModel(description = "用户信息")  
public class User {  
    // ...  
}

        2. @ApiModelProperty:用于描述Model的字段(属性)的详细信息,如名称、描述、是否必需等。

import io.swagger.annotations.ApiModelProperty;  
  
public class User {  
      
    @ApiModelProperty(value = "用户ID", example = "12345")  
    private Long id;  
  
    @ApiModelProperty(value = "用户名", required = true)  
    private String username;  
  
    // ...  
}

 

请注意,Swagger的注解(如@Api@ApiOperation等)和Springfox(一个常用的Swagger集成库)的注解(如@ApiInfo)是不同的。在上面的示例中,我主要使用了Swagger的注解,因为它们是直接由Swagger项目提供的,并且与Swagger UI紧密集成。然而,在Spring Boot项目中,你通常会通过Springfox(现在可能被称为Springdoc OpenAPI,Springfox的替代品)来集成Swagger,但注解的使用方式大致相同。

2.2.2 编写API文档说明

Swagger的搭建与配置过程中,编写API文档说明是一个核心环节。以下是一个清晰的案例指南:

 编写Controller和注解

在你的Controller中,你需要使用Swagger提供的注解来描述API的方法、参数、响应等信息。这些注解包括但不限于:

  • @Api:用于Controller类上,描述该类的作用。
  • @ApiOperation:用于方法上,描述该方法的作用。
  • @ApiImplicitParams@ApiImplicitParam:用于描述方法的参数。
  • @ApiResponses@ApiResponse:用于描述方法的响应。
  • @ApiModel@ApiModelProperty:用于描述返回对象的模型。
import io.swagger.annotations.Api;  
import io.swagger.annotations.ApiOperation;  
import io.swagger.annotations.ApiImplicitParam;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
@Api(tags = "UserController")  
public class UserController {  
  
    @GetMapping("/user")  
    @ApiOperation(value = "获取用户信息", notes = "根据用户ID获取用户信息")  
    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "Long")  
    public User getUser(@RequestParam Long userId) {  
        // 方法实现  
        return new User();  
    }  
}

访问Swagger UI

配置完成后,你可以通过访问Swagger UI来查看你的API文档。通常,Swagger UI的访问地址是http://localhost:8080/swagger-ui.html(端口号可能因你的配置而异)。在Swagger UI页面上,你可以看到所有被Swagger扫描并生成的API文档,包括API的标题、描述、版本信息,以及每个API的方法、参数、响应等详细信息。

总结

编写Swagger API文档说明主要涉及到引入Swagger依赖、配置Swagger、编写Controller和注解以及访问Swagger UI等步骤。通过这些步骤,你可以为你的Web服务生成详细、易读的API文档,方便前后端开发人员之间的沟通和协作。

三、Swagger的进阶使用

3.1 自定义Swagger UI

       详见《Swagger的原理及应用详解(八)

3.2 Swagger与Spring Boot集成

       详见《Swagger的原理及应用详解(九)

3.3 Swagger与其他框架的集成

       详见《Swagger的原理及应用详解(十)

四、常见问题与解决方案

4.1 Swagger UI无法访问

        详见《Swagger的原理及应用详解(十一)

4.2 生成的API文档不准确

        详见《Swagger的原理及应用详解(十一)

4.3 Swagger性能优化

        详见《Swagger的原理及应用详解(十二)

五、总结与展望

        详见《Swagger的原理及应用详解(十二)

六、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

【Linux】Linux常用指令合集精讲,一篇让你彻底掌握(万字真言)

文章目录 一、文件与目录操作1.1 ls - 列出目录内容1.2 cd - 切换目录1.3 pwd - 显示当前目录1.4 mkdir - 创建目录1.5 rmdir - 删除空目录1.6 rm - 删除文件或目录1.7 cp - 复制文件或目录1.8 mv - 移动或重命名文件或目录1.9 touch - 创建空文件或更新文件时间戳 二、文件内容…

朗新天霁eHR GetFunc_code.asmx SQL注入致RCE漏洞复现

0x01 产品简介 朗新天霁人力资源管理系统(LongShine eHR)是一款由北京朗新天霁软件技术有限公司研发的人力资源管理系统,该产品融合了国外先进的人力资源管理理念和国内大量人力资源管理实践经验,是国内功能较为全面、性价比较高的人力资源管理系统之一,系统凭借其集成化…

@amap/amap-jsapi-loader实现高德地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7"2.加入项目中 关于接口获取key的接口 大家改成自己对应的项目请求方法 import React, { PureComponent } from react; import { Input…

厂家技术 最新钨蚀刻液的制作方法

网盘 https://pan.baidu.com/s/15ZAiUicstYEiFPvNKK72VA?pwd6u4x VCSEL芯片金薄膜蚀刻液及其蚀刻方法.pdf 废铝蚀刻液回收磷酸的方法.pdf 抑制二氧化硅蚀刻的无C蚀刻液.pdf 氮化硅和钨的选择性蚀刻液.pdf 用于在穿孔中选择性沉积钨的系统和方法.pdf 蚀刻液和使用了所述蚀刻液…

香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别

OrangePi AIpro 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;自发布以来就引起了我的极大关注。其配备的8/20TOPS澎湃算力&#xff0c;堪称目前开发板市场中的顶尖性能&#xff0c;实在令人垂涎三尺。如此强大的板子&#xff0c;当然要亲自体验一番。今天非常荣幸地拿到…

【C++】BMP图片结构深度解析及其在C++中的操作与应用

引言 BMP&#xff08;Bitmap Image File&#xff09;是一种与设备无关的图像文件格式&#xff0c;它采用了一种非常直接的方式来存储图像数据&#xff0c;即按照图像的行和列顺序&#xff0c;逐像素地存储颜色值。由于其简单性和可移植性&#xff0c;BMP文件在图像处理、图像分…

看看这组B端规范,你就会感叹:钱真是万能的。

B端设计规范的作用和价值主要体现在以下几个方面&#xff1a; 统一视觉风格和用户体验&#xff1a;B端设计规范可以规定统一的视觉风格和用户界面&#xff0c;使得不同的产品和服务在外观和交互上保持一致&#xff0c;提升用户的使用体验和满意度。 提高产品开发效率&#xf…

Android Studio下载Gradle特别慢,甚至超时,失败。。。解决方法

使用Android studio下载或更新gradle时超级慢怎么办&#xff1f; 切换服务器&#xff0c;立马解决。打开gradle配置文件 修改服务器路径 distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip 最后&#xff0c;同步&#xff0c;下载&#xff0c;速…

【RAG检索增强生成】MaxKB:构建企业级知识库问答系统(Ollama+Qwen2)

目录 引言1、MaxKB概述1.1 定义与目标1.2 特点与优势 2、MaxKB原理3、MaxKB架构4、基于MaxKBOllamaQwen2搭建本地知识库4.1 环境准备4.2 部署MaxKB4.3 部署Ollama4.4 部署运行qwen24.5 知识库配置4.5.1登录 MaxKB 系统4.5.2上传文档4.5.3设置分段规则 4.6 模型配置4.7 创建应用…

一入“网贷”深似海:来自多名负债人的真实自述!

在温州&#xff0c;有个名叫小琴的25岁女孩&#xff0c;她的故事&#xff0c;是许多年轻人深陷网贷泥潭的一个缩影。小琴&#xff0c;一个普通的大学毕业生&#xff0c;两年的职场生涯并未能让她摆脱大学时期留下的网贷阴影。那时&#xff0c;她每月靠着1000元的生活费勉强维持…

注意!Vue.js 或 Nuxt.js 中请停止使用.value

大家好&#xff0c;我是CodeQi&#xff01; 一位热衷于技术分享的码仔。 当您在代码中使用.value时&#xff0c;必须每次都检查变量是否存在并且是引用。 这可能很麻烦&#xff0c;因为在运行时使用.value可能会导致错误。然而&#xff0c;有一个简单的解决方法&#xff0c;即…

力扣61. 旋转链表(java)

思路&#xff1a;用快慢指针找到最后链表k个需要移动的节点&#xff0c;然后中间断开节点&#xff0c;原尾节点连接原头节点&#xff0c;返回新的节点即可&#xff1b; 但因为k可能比节点数大&#xff0c;所以需要先统计节点个数&#xff0c;再取模&#xff0c;看看k到底需要移…

【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)

目录 概述&#xff1a; 1. 阻塞IO (Blocking IO) 2. 非阻塞IO (Non-blocking IO) 3. IO多路复用 (I/O Multiplexing) 4. 信号驱动IO (Signal-driven IO) 阻塞式IO 非阻塞式IO 信号驱动IO&#xff08;Signal-driven IO&#xff09; 信号IO实例&#xff1a; IO多路复用…

2024企业加密软件丨为什么企业需要防泄密

企业为什么需要防泄密&#xff1f; 企业的数据中包含了许多核心机密&#xff0c;如研发成果、商业计划、客户资料等。这些信息的泄露可能使竞争对手获得不正当的优势&#xff0c;给企业带来严重损失。 数据泄露事件往往会对企业的声誉造成负面影响&#xff0c;降低客户信任度…

【ROS2】Ubuntu 24.04 源码编译安装 Jazzy Jalisco

目录 系统要求 系统设置 设置区域启用所需的存储库安装开发工具 构建 ROS 2 获取 ROS 2 代码使用 rosdep 安装依赖项安装额外的 RMW 实现&#xff08;可选&#xff09;在工作区构建代码 设置环境 尝试一些例子 下一步 备用编译器 Clang保持最新状态 故障排除 卸载 系统要求 当前…

RRStudio 下载及安装(详尽版)

R语言来自S语言&#xff0c;是S语言的一个变种。S语言、C语言、Unix系统都是贝尔实验室的研究成果。R 语言是一种解释型的面向数学理论研究工作者的语言&#xff0c;主要用于统计分析、绘图、数据挖掘。 R 语言自由软件&#xff0c;免费、开放源代码&#xff0c;支持各个主要计…

python实现windows非白名单exe监控并杀死

目录 一、限定死白名单 二、增加自定义白名单文件 需求&#xff1a;孩子在家用电脑上网课&#xff0c;总是悄悄打开游戏或视频软件 方案&#xff1a;指定白名单exe&#xff0c;打开非白名单的就自动被杀死&#xff0c;并记录日志供查看 一、限定死白名单 import psutil imp…

【C语言】continue 关键字

当在C语言中使用continue关键字时&#xff0c;它用于控制循环语句的执行流程。与break不同&#xff0c;continue不会终止整个循环&#xff0c;而是终止当前迭代&#xff0c;并立即开始下一次迭代。这种行为使得可以在循环内部根据特定条件跳过某些代码块&#xff0c;从而控制程…

中国国家标准介绍

一、介绍 中国国家标准信息公共服务平台&#xff0c;这是由中国国家市场监督管理总局和中国国家标准化管理委员会共同运营的官方网站 https://openstd.samr.gov.cn/ 标准分为三类&#xff1a; GB&#xff1a;强制性国家标准GB/T&#xff1a;推荐行国家标准GB/Z&#xff1a;指导…