API开发秘籍:揭秘Swagger与Spring REST Docs的文档自动化神技

在这个数字化时代,如何让你的业务像外卖一样快速送达顾客手中?本文将带你走进Spring Boot的世界,学习如何利用RESTful API构建一个高效、直观的“外卖帝国”。从基础的REST架构风格,到Spring MVC的魔力,再到Swagger和Spring REST Docs的文档自动化,每一步都充满了技术的魅力和创新的智慧。让我们一起探索如何用代码烹饪出令人垂涎的数字化美食,满足顾客的每一个需求!

文章目录

    • 第1章:设计 RESTful API 的原则
      • 1.1 理解 REST 架构风格
      • 1.2 URI 设计与资源定位
      • 1.3 HTTP 方法与操作行为
      • 1.4 状态码传达意义
      • 1.5 超媒体与链接关系
    • 第2章:使用 Spring MVC 创建 REST 控制器
      • 2.1 引入 Spring Web 依赖
      • 2.2 创建 REST 控制器类
      • 2.3 处理 HTTP 请求方法
        • 2.3.1 GET 请求处理
        • 2.3.2 POST 请求与实体接收
        • 2.3.3 PUT 与 DELETE 请求
      • 2.4 参数绑定与路径变量
      • 2.5 返回响应实体与状态码
    • 第3章:集成 Swagger 或 Spring REST Docs 生成 API 文档
      • 3.1 Swagger 介绍与集成
        • 3.1.1 添加 Swagger 依赖
        • 3.1.2 配置 Swagger UI
        • 3.1.3 使用注解标记 API
      • 3.2 Spring REST Docs 简介
        • 3.2.1 REST Docs 安装与配置
        • 3.2.2 基于测试生成文档
      • 3.3 选择与对比:Swagger vs Spring REST Docs
      • 数据库设计
      • 集成MySQL
      • 配置数据库连接
      • 实体类映射
      • 仓库接口
      • 服务层和控制器
      • 测试

在这里插入图片描述

第1章:设计 RESTful API 的原则

1.1 理解 REST 架构风格

想象一下,你正在一家餐厅里,菜单上摆满了各种美食。你不需要知道后厨是如何制作这些美食的,你只需要告诉服务员你想要什么,然后等待美食上桌。这就是 RESTful API 的精髓所在——简单、直观、无需过多解释。

REST,即表述性状态转移(Representational State Transfer),是一种设计风格,它让网络服务像菜单一样简单易懂。在 RESTful 架构中,每个资源(比如用户信息、订单详情)都有一个唯一的标识符(URI),你可以通过标准的 HTTP 方法(GET、POST、PUT、DELETE)来获取或修改这些资源。

1.2 URI 设计与资源定位

URI,也就是统一资源标识符,就像是餐厅菜单上的编号。当你告诉服务员“我要编号3的菜”,服务员就知道要给你上什么菜。在 RESTful API 中,URI 用来精确地定位资源。一个好的 URI 设计应该简洁明了,比如 /users/123 就清晰地告诉了我们这是关于用户ID为123的信息。

1.3 HTTP 方法与操作行为

HTTP 方法就像是你对服务员的指令。如果你说“给我来一份”,那么服务员会用 GET 方法去查找信息;如果你说“更新一下”,那么服务员可能会用 PUT 方法去更新信息;如果你说“取消订单”,那么 DELETE 方法就会被用到。

  • GET:就像点菜,请求获取资源。
  • POST:就像下单,创建新资源。
  • PUT:就像更新菜单,更新现有资源。
  • DELETE:就像取消订单,删除资源。

1.4 状态码传达意义

状态码就像是服务员给你的反馈。200 表示一切顺利,你的菜已经上桌;404 表示你要的菜没了,资源找不到;500 则是后厨出了问题,服务器内部错误。

  • 200 OK:请求成功。
  • 201 Created:资源创建成功。
  • 400 Bad Request:请求有误。
  • 404 Not Found:资源不存在。
  • 500 Internal Server Error:服务器错误。

1.5 超媒体与链接关系

最后,超媒体和链接关系就像是菜单上的推荐组合。RESTful API 通过超媒体提供资源之间的链接,让客户端能够发现和导航到相关资源。这就像是服务员告诉你,“如果你喜欢这道菜,你可能会喜欢我们的特色菜”。

通过这样的设计,RESTful API 就像是一家精心设计的餐厅,让顾客(客户端)能够轻松地点菜(请求资源),享受美食(数据交互),而无需关心后厨(服务器)的复杂操作。

这就是 RESTful API 的设计原则,简单、直观、高效,就像一家好餐厅,让每一位顾客都能满意而归。接下来,我们将进入 Spring MVC 的世界,开始我们的 REST 控制器之旅。别着急,慢慢来,我们一步一步来。

第2章:使用 Spring MVC 创建 REST 控制器

2.1 引入 Spring Web 依赖

想象一下,你已经拥有了一家餐厅,现在你想要扩展你的业务,提供外卖服务。为了做到这一点,你需要一些特别的工具和配料。在 Spring Boot 的世界里,这些工具和配料就是依赖项。首先,你需要在你的项目中引入 Spring Web 依赖,这就像是购买厨房设备和食材,为制作外卖做准备。

在你的 pom.xml 文件中(如果你使用的是 Maven),你需要添加如下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

这将为你的 RESTful API 服务提供所需的一切,包括 Spring MVC 和 Tomcat。

2.2 创建 REST 控制器类

现在,你已经准备好了所有的材料,是时候开始制作你的“外卖菜单”了。在 Spring MVC 中,你需要创建一个 REST 控制器类,这就像是你的菜单,列出了所有的服务项。

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;@RestController
public class RestaurantController {@RequestMapping("/dish")public String getDish() {return "Here is your dish!";}
}

在这个例子中,@RestController 注解告诉 Spring 这个类是一个控制器,而 @RequestMapping 则定义了访问这个控制器的路径。

2.3 处理 HTTP 请求方法

2.3.1 GET 请求处理

假设你想要添加一个功能,让顾客能够查看菜单。这可以通过处理 GET 请求来实现:

@RequestMapping(value = "/menu", method = RequestMethod.GET)
public String getMenu() {return "Here is today's menu!";
}

当顾客访问 /menu 路径时,他们将看到今天的菜单。

2.3.2 POST 请求与实体接收

如果你想要让顾客能够下单,你需要处理 POST 请求。此外,你还需要接收顾客的订单信息:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;@PostMapping("/order")
public String placeOrder(@RequestBody Order order) {// 处理订单逻辑return "Order placed successfully!";
}

在这个例子中,@RequestBody 注解用于将请求体中的 JSON 数据绑定到 Order 对象。

2.3.3 PUT 与 DELETE 请求

如果你的顾客想要修改或取消预订,你可以添加 PUT 和 DELETE 请求的处理:

@RequestMapping(value = "/order/{id}", method = RequestMethod.PUT)
public String updateOrder(@PathVariable("id") Long orderId, @RequestBody Order updatedOrder) {// 更新订单逻辑return "Order updated successfully!";
}@RequestMapping(value = "/order/{id}", method = RequestMethod.DELETE)
public String cancelOrder(@PathVariable("id") Long orderId) {// 取消订单逻辑return "Order cancelled successfully!";
}

2.4 参数绑定与路径变量

在处理请求时,你经常需要从 URL 中提取信息,比如订单ID。Spring MVC 允许你使用路径变量来实现这一点:

@RequestMapping(value = "/order/{id}", method = RequestMethod.GET)
public String getOrder(@PathVariable Long id) {// 根据ID获取订单逻辑return "Here is your order with ID: " + id;
}

@PathVariable 注解用于将路径中的变量绑定到方法参数。

2.5 返回响应实体与状态码

最后,不要忘记返回响应实体和合适的状态码。这就像是给顾客提供美食的同时,告诉他们一切安好:

import org.springframework.http.ResponseEntity;@GetMapping("/menu")
public ResponseEntity<String> getMenu() {String menu = "Here is today's menu!";return ResponseEntity.ok(menu); // 返回200状态码
}

使用 ResponseEntity,你可以自定义响应的状态码和响应体。


通过这些步骤,你的 RESTful API 就像是一家提供外卖服务的餐厅,顾客可以通过网络下单,享受你的美食。接下来,我们将探索如何让这个过程更加透明和易于理解,通过集成 Swagger 或 Spring REST Docs 来生成 API 文档。别着急,慢慢来,我们一步一步来。

在这里插入图片描述

第3章:集成 Swagger 或 Spring REST Docs 生成 API 文档

3.1 Swagger 介绍与集成

3.1.1 添加 Swagger 依赖

在上一章,我们学会了如何用 Spring MVC 制作我们的 RESTful API “外卖菜单”。现在,让我们来聊聊如何让顾客们更好地了解我们的菜单——也就是我们的 API 文档。Swagger 就是那个能让我们的菜单更加生动、直观的工具。

首先,我们需要在项目中添加 Swagger 的依赖。这就像是在菜单上添加一些精美的图片和描述,让顾客一眼就能看明白。

如果你使用的是 Maven,在你的 pom.xml 文件中添加以下依赖:

<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
3.1.2 配置 Swagger UI

添加了依赖之后,我们需要配置 Swagger,让它知道我们的 API 都在哪里。这就像是在菜单上标注出每道菜的位置,方便顾客快速找到。

创建一个配置类,比如 SwaggerConfig.java,并添加如下配置:

import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.PathSelectors;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build();}
}

这段代码告诉 Swagger,它需要扫描所有的 API,并为它们生成文档。

3.1.3 使用注解标记 API

现在,Swagger 已经准备好了,我们可以开始使用注解来丰富我们的 API 文档了。这就像是给菜单上的每道菜添加一些特别的说明,比如食材来源、烹饪方法等。

在控制器或方法上使用 @ApiOperation 注解,可以为 API 添加描述:

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;@RestController
public class RestaurantController {@Operation(summary = "获取今日菜单", description = "返回今日菜单的详细信息")@GetMapping("/menu")public ResponseEntity<String> getMenu() {String menu = "Here is today's menu with delicious dishes!";return ResponseEntity.ok(menu);}
}

这样,顾客在查看 Swagger UI 时,就能看到详细的 API 描述了。

3.2 Spring REST Docs 简介

3.2.1 REST Docs 安装与配置

除了 Swagger,Spring 还提供了另一个强大的工具——Spring REST Docs。它通过结合 Javadoc 注解和实际的 HTTP 请求/响应来生成文档。这就像是为菜单拍摄一些真实的美食照片,让顾客能够看到他们将要吃到的食物。

要在项目中添加 Spring REST Docs,需要添加以下依赖:

<dependency><groupId>org.springframework.restdocs</groupId><artifactId>spring-restdocs-mockmvc</artifactId><scope>test</scope>
</dependency>
3.2.2 基于测试生成文档

使用 Spring REST Docs,你需要编写测试用例来生成文档。这就像是拍摄美食照片的过程,你需要确保每张照片都能真实反映食物的美味。

创建一个测试类,比如 ApiDocumentation.java,并添加如下测试:

import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class ApiDocumentation {@BeforeEachpublic void setUp(RestDocumentationContextProvider restDocumentation) {MockMvc mockMvc = mockMvc.perform(get("/menu")).andExpect(status().isOk()).andDo(document("get-menu",preprocessResponse(prettyPrint()),request(),response(),pathParameters(),cookies(),requestHeaders(),responseHeaders(),contentType()));}
}

这段代码会生成一个包含请求和响应详细信息的文档。

3.3 选择与对比:Swagger vs Spring REST Docs

Swagger 和 Spring REST Docs 都是生成 API 文档的强大工具,但它们各有特点。

  • Swagger:提供了一个交互式的 UI,让顾客能够直接在文档中尝试 API。它适合快速展示 API 并提供即时反馈。
  • Spring REST Docs:侧重于生成详细的文档,适合需要详尽文档的项目。它通过测试来确保文档的准确性。

选择哪一个,取决于你的项目需求和个人喜好。有时候,两者结合使用也是一个不错的选择。


通过集成 Swagger 或 Spring REST Docs,我们的 RESTful API “外卖菜单” 不仅能够提供美食,还能让顾客在点餐前就对每一道菜有充分的了解。这样一来,我们的服务就更加周到,顾客的满意度也会随之提高。下一章,我们将回顾 RESTful API 设计与实现的关键点,并展望未来的开发趋势。别着急,慢慢来,我们一步一步思考。

在构建RESTful API时,数据库的使用是不可或缺的一环。MySQL作为广泛使用的开源关系数据库管理系统,以其高性能、高可靠性和易用性而闻名。接下来,我们将通过一个具体的样例,展示如何在Spring Boot应用中集成MySQL,并使用它来存储和管理数据。

数据库设计

首先,我们需要设计一个简单的数据库模型。假设我们正在开发一个博客平台,我们需要存储用户信息和他们的博客文章。我们可以设计如下两个表:

  1. Users: 存储用户信息。
  2. Posts: 存储用户发表的文章。
CREATE TABLE Users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) NOT NULL,email VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL
);CREATE TABLE Posts (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255) NOT NULL,content TEXT NOT NULL,user_id INT,FOREIGN KEY (user_id) REFERENCES Users(id)
);

集成MySQL

在Spring Boot应用中集成MySQL,首先需要添加依赖。在pom.xml中添加如下依赖:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

配置数据库连接

接下来,在application.properties文件中配置数据库连接:

spring.datasource.url=jdbc:mysql://localhost:3306/blogdb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

实体类映射

定义实体类与数据库表进行映射。在Spring Data JPA中,我们使用@Entity@Table注解来完成这个工作。

@Entity
@Table(name = "Users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String username;private String email;private String password;// Getters and Setters
}@Entity
@Table(name = "Posts")
public class Post {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String title;private String content;@ManyToOne@JoinColumn(name = "user_id", referencedColumnName = "id")private User user;// Getters and Setters
}

仓库接口

Spring Data JPA允许我们通过定义接口并继承JpaRepository接口来简化数据访问层的编码。

public interface UserRepository extends JpaRepository<User, Integer> {List<User> findByUsername(String username);
}public interface PostRepository extends JpaRepository<Post, Integer> {List<Post> findByTitleContaining(String title);
}

服务层和控制器

接下来,我们创建服务层来处理业务逻辑,并创建控制器来处理HTTP请求。

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User findUserByUsername(String username) {return userRepository.findByUsername(username).stream().findFirst().orElse(null);}
}@RestController
@RequestMapping("/api")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{username}")public ResponseEntity<?> getUser(@PathVariable String username) {User user = userService.findUserByUsername(username);if (user == null) {return ResponseEntity.notFound().build();}return ResponseEntity.ok(user);}
}

测试

最后,我们编写测试来确保一切按预期工作。

@SpringBootTest
public class UserControllerTest {@Testpublic void whenGetUser_thenReturnUser() throws Exception {MockMvc mockMvc = standaloneSetup(new UserController()).build();MvcResult mvcResult = mockMvc.perform(get("/api/users/johnDoe")).andExpect(status().isOk()).andReturn();String content = mvcResult.getResponse().getContentAsString();assertNotNull(content);assertTrue(content.contains("johnDoe"));}
}

通过这个样例,我们展示了如何在Spring Boot应用中集成MySQL,并使用RESTful API来管理用户和博客文章。这只是一个起点,根据实际需求,你可以扩展数据库模型、增加更多功能,并优化API的设计。记住,一个好的API设计和实现,加上强大的数据库支持,可以为你的应用程序带来强大的竞争力。
在这里插入图片描述
通过这段旅程,我们不仅学会了如何设计和实现 RESTful API,还了解了如何通过自动化工具生成文档,以及未来 API 开发的趋势。就像一家餐厅不断推陈出新,我们的 API 也需要不断地进化和完善,以满足用户的需求。

现在,我们的 “外卖菜单” 已经准备就绪,只等顾客们来品尝。别着急,慢慢来,我们的服务才刚刚开始!

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

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

相关文章

追寻美的指引--纪念西蒙斯

周六早上醒来&#xff0c;James Simons&#xff08;西蒙斯&#xff09;辞世的消息刷屏了。多数人知道他&#xff0c;是因为他的财富和量化对冲基金公司-文艺复兴。但他更值得为人纪念的身份&#xff0c;则是数学家和慈善家。 西蒙斯1938年生于麻省&#xff0c;毕业于MIT&#…

探索 Python 的 vars() 函数

大家好&#xff0c;在软件开发的过程中&#xff0c;调试是一个不可或缺的环节。无论你是在解决 bug&#xff0c;优化代码&#xff0c;还是探索代码的执行流程&#xff0c;都需要一些有效的工具来帮助你更好地理解和调试代码。在 Python 编程中&#xff0c;vars() 函数是一个非常…

编程环境资源汇总

目录 前言 正文 虚拟机模块 常用软件模块&#xff08;同时包含各别好用的小软件&#xff09; 语言模块 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in Univer…

论文阅读笔记(十一)——BioInformatics Agent (BIA)

论文阅读笔记(十一)——BioInformatics Agent (BIA): Unleashing the Power of Large Language Models to Reshape Bioinformatics Workflow 目录 论文阅读笔记(十一)——BioInformatics Agent (BIA): Unleashing the Power of Large Language Models to Reshape Bioinformatic…

【C++奇妙冒险】日期类Date的实现

文章目录 前言日期类Date的接口设计构造函数和打印函数获取日期并判断日期是否合法日期类的大小比较关系<运算符重载 判断小于运算符重载 判断相等<运算符重载 判断小于等于>运算符重载 判断大于> 运算符重载 判断大于等于! 运算符重载 不等于 日期类计算日期天数日…

一维数组基础(题目+答案)

第1题 反向输出 时限&#xff1a;1s 空间&#xff1a;256m 输入n个数&#xff0c;要求程序按输入时的逆序把这n个数打印出来&#xff0c;已知整数不超过100个。也就是说&#xff0c;按输入相反顺序打印这n个数。 输入格式 第一行&#xff1a;一个整数n&#xff0c;代表…

成功解决“IndexError: pop index out of range”错误的全面指南

成功解决“IndexError: pop index out of range”错误的全面指南 引言 在Python编程中&#xff0c;处理列表&#xff08;list&#xff09;、双端队列&#xff08;deque&#xff09;或其他可迭代对象时&#xff0c;我们经常使用pop()方法来移除并返回指定索引处的元素。然而&am…

JD手机商品参数对比

前言废话 这不618快到了, 手机又有点问题了; 想换个手机, 但是手机不知道选哪个; 想着能不能对比一下, JD自带的对比只能两个商品不是很够用; 就尝试写一个 首先就是要把需要对比的商品都添加到关注商品里 然后搜索所需的信息, 找哪个接口获取的 然后查看分析html结构, xpa…

赢销侠的秘密武器:如何提升客户满意度?

在竞争激烈的商业战场上&#xff0c;客户满意度是企业能否长盛不衰的关键。它如同一面镜子&#xff0c;映照出企业的服务质量和产品实力。那么&#xff0c;赢销侠们是如何运用秘密武器来提升客户满意度的呢&#xff1f;本文将深入探讨这一课题&#xff0c;并揭示背后的策略与智…

生命在于学习——Python人工智能原理(3.1)

三、深度学习 &#xff08;一&#xff09;深度学习的概念 1、深度学习的来源 深度学习的概念来源于人工神经网络&#xff0c;所以又称深度神经网络。 人工神经网络主要使用计算机的计算单元和存储单元模拟人类大脑神经系统中大量的神经细胞&#xff08;神经元&#xff09;通关…

06.持久化存储

6.持久化存储 pv: persistent volume 全局的资源 pv&#xff0c;node pvc: persistent volume claim 局部的资源&#xff08;namespace&#xff09;pod&#xff0c;rc&#xff0c;svc 6.1:安装nfs服务端(192.168.111.11) yum install nfs-utils.x86_64 -y mkdir /data vim /…

MyBatis 的在使用上的注意事项及其辨析

1. MyBatis 的在使用上的注意事项及其辨析 文章目录 1. MyBatis 的在使用上的注意事项及其辨析2. 准备工作3. #{ } 与 ${ } 的区别和使用3.1 什么情况下必须使用 ${ }3.1.1 拼接表名3.1.2 批量删除3.1.3 模糊查询3.1.3.1 使用 ${ }的方式3.1.3.2 使用 #{ } 的方式 4. typeAlias…

风景的短视频一分钟:成都科成博通文化传媒公司

风景的短视频一分钟&#xff1a;时光凝固的画卷 在快节奏的现代生活中&#xff0c;我们常常被繁忙和琐碎所困扰&#xff0c;渴望在喧嚣中找到一丝宁静与美好。而风景的短视频&#xff0c;正是这样一份能够让我们在短时间内沉浸于自然之美的奇妙礼物。成都科成博通文化传媒公司…

牛客BM85 验证IP地址【中等 字符串 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880 https://www.lintcode.com/problem/1222/description 思路 直接模拟&#xff0c;注意IPv4,ipv6的条件Java代码 import java.util.*;public class Solution {/*** 验证IP地址…

关于IDEA创建Maven一直爆红无法下载的问题

你能看到这我就知道你肯定已经试过了网上的很多方法了&#xff0c;我之前也是&#xff0c;试过了很多一直无法正常下载&#xff0c;我也是找人给 线下看了看解决了&#xff0c;我总结一下从头到尾排除问题&#xff0c;试到最后要是还解决不了你直接私信我&#xff0c;我给你看看…

路由策略实验1

先把地址全部配通 对R1 对R2 对R4 对R3 对R5 对R6 对R7 然后起路由协议 对R1 对R2 对R3 对R4 对R5 对R6 对R7

C++17之std::void_t

目录 1.std::void_t 的原理 2.std::void_t 的应用 2.1.判断成员存在性 2.1.1.判断嵌套类型定义 2.1.2 判断成员是否存在 2.2 判断表达式是否合法 2.2.1 判断是否支持前置运算符 2.2.3 判断两个类型是否可做加法运算 3.std::void_t 与 std::enable_if 1.std::void_t 的…

猫头虎分享已解决Bug || **Eslint插件安装问题Unable to resolve eslint-plugin-猫头虎

猫头虎分享已解决Bug || **Eslint插件安装问题Unable to resolve eslint-plugin-猫头虎 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的…

将 py 文件编译成 pyd 文件

文章目录 一、简介1.1、Python中的文件类型&#xff1a;.py .pyc .pyd1.2、基本原理1.2.1、函数详解&#xff1a;Extension() —— 用于定义扩展模块&#xff08;C/C 扩展&#xff09;的类1.2.2、函数详解&#xff1a;setup() —— 用于配置和构建包的函数 二、构建过程2.0、…

百度文心一言API批量多线程写文章软件-key免费无限写

百度文心大模型的两款主力模型ENIRE Speed、ENIRE Lite全面免费&#xff0c;即刻生效。 百度文心大模型的两款主力模型 这意味着&#xff0c;大模型已进入免费时代&#xff01; 据了解&#xff0c;这两款大模型发布于今年 3 月&#xff0c;支持 8K 和 128k 上下文长度。 ER…