HTTP 和RESTful API 基础,答疑
一文搞懂RESTful API - bigsai - 博客园
1. API 路径 开头必须 /,表示绝对路径,不支持 . 或 ..(相对路径)。API 结尾 / 通常不需要,但部分框架会自动处理 / → 无 /。
✅ 推荐
GET /api/v1/products # 资源集合
GET /api/v1/products/123 # 具体资源
🚫 避免
GET ./api/v1/products # ❌ API 不能用 `.` 开头
GET /api/v1/products/ # ❌ 可能导致 404
2. 系统路径 Linux/Windows 支持 . 开头(相对路径)。结尾 / 代表目录,不加 / 可能是文件。
/home/user/docs/ # 目录
/home/user/docs.txt # 文件
3. 关键区别
| 特性 | API 路径 | 系统路径 |
|---|---|---|
| 相对路径 | ❌ 不支持 . | ✅ ./file.txt 代表当前目录 |
| 绝对路径 | ✅ /api/v1/users | ✅ /home/user/docs/ |
结尾 / | 🚫 通常不加 | ✅ 代表目录 |
✅ 最佳实践 API 必须 / 开头,通常不加结尾 /。文件路径 目录加 /,文件不加 /。
Swagger 提供了一套完整的工具集,用于设计、构建、文档化和测试 RESTful API。其核心组件包括 Swagger Codegen 和 Swagger UI。Swagger Codegen 生成的是代码框架(客户端 SDK 或服务端模板),需要开发者补充逻辑才能运行。Swagger UI 生成的是交互式文档网页,用于展示和测试 API,不涉及代码生成。
1. Swagger Codegen 的作用与效果
功能:根据 OpenAPI 规范(YAML/JSON 格式的 API 描述文件),自动生成客户端 SDK(如 Java、Python 的调用库)和服务器端框架代码(如 Spring Boot、Flask 的接口实现模板)。
生成内容:
- 代码文件:例如生成 Java 的模型类、接口定义、HTTP 请求工具类,或 Python 的 Flask 路由代码等。这些文件需要开发者进一步补充业务逻辑才能运行。
- 支持框架:生成的代码适配多种框架(如 Spring Boot、Django、Express),但并非“完整的应用程序”,而是提供基础代码框架,开发者需自行完善。
使用场景:假设你有一个 OpenAPI 文件,通过 Swagger Codegen 可以快速生成客户端调用库(供其他服务使用你的 API)或服务端接口模板(简化开发流程)。
2. Swagger UI 的作用与效果
功能:将 OpenAPI 规范文件转换为交互式文档网页,允许用户直接在浏览器中查看 API 端点、参数说明,并实时发送请求测试接口。
生成内容:
-
可视化界面:以 HTML/CSS/JS 渲染的网页,展示 API 的路径、请求方法、参数、响应示例等。用户可填写参数并点击“Try it out”测试接口。
-
实时反馈:显示请求的响应结果(如 JSON 数据)、状态码及错误信息,帮助开发者和测试人员快速验证 API 功能。
使用场景:在开发阶段,后端团队通过 Swagger UI 提供文档给前端或测试团队,减少沟通成本;部署后,作为 API 的官方文档供外部调用者参考。
3. OpenAPI 规范文件的实际形态
文件格式:通常是 YAML 或 JSON 文件,例如 openapi.yaml 或 swagger.json,定义了 API 的元数据(如标题、版本)、端点路径、请求方法、参数类型、响应格式及错误码等。例如:
openapi: 3.0.0
info:title: 示例APIversion: 1.0.0
paths:/users:get:summary: 获取用户列表parameters:- name: limitin: queryschema:type: integerresponses:'200':description: 成功返回用户列表
Swagger UI 的界面示例
访问方式:启动服务后,通过 URL(如 http://localhost:8080/swagger-ui.html)打开页面。
界面元素:API 列表:左侧展示所有接口路径(如 /users、/orders)。参数输入框:支持填写路径参数、查询参数、请求体(JSON 格式)。测试按钮:点击“Try it out”发送请求,页面下方显示服务器响应结果。示例值:自动生成请求和响应的示例数据,帮助理解接口用法。
4. RESTful API 框架分类
Java 生态:Spring Boot:最流行的 Java 框架,内置 Tomcat,支持快速构建 REST API。JAX-RS:Java 标准(如 Jersey、RESTEasy),基于注解开发。
Python 生态:Django REST Framework:基于 Django,适合复杂业务和权限控制。Flask:轻量级,通过扩展(如 Flask-RESTful)支持 REST。FastAPI:高性能,支持异步和自动生成 Swagger 文档。
5. 跨语言项目的可行性
可以同时使用 Java 和 Python 框架,但需要通过 API 通信或消息队列解耦。例如:Java 主系统:处理核心业务(如医院管理系统的患者数据)Python 子服务:调用 LLM(如 GPT-3)生成 SQL,通过 HTTP API 返回结果给 Java 系统。
技术实现:Java 后端调用 Python 服务的 API(如 FastAPI 暴露的 /generate-sql 端点)。数据格式统一(如 JSON),确保跨语言解析兼容。使用 API 网关(如 Spring Cloud Gateway)统一管理请求路由。
FastAPI、Postman、Flask 的关系
- FastAPI 和 Flask:两者都是 Python 的 Web 框架,用于构建 API。FastAPI 的性能优于 Flask,适合大规模并发应用。Flask 适合简单的 Web 应用。
- FastAPI:基于 ASGI(异步服务器网关接口),支持异步编程和高性能,内置数据验证(Pydantic)、自动文档生成(Swagger/ReDoc)。Flask:基于 WSGI(同步接口),轻量级但需手动处理数据验证和文档生成。
- 兼容性:FastAPI 与异步数据库(如 asyncpg)更适配,Flask 适合搭配传统同步库(如 SQLAlchemy)。
- Postman:独立于框架的 API 测试工具,用于调试和验证 FastAPI/Flask 开发的接口。
示例代码(FastAPI vs Flask)
# FastAPI 示例(异步)
from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
async def read_item(item_id: int):return {"item_id": item_id}# 运行: uvicorn filename:app --reload
# Flask 示例(同步)
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/items/<int:item_id>', methods=['GET'])
def get_item(item_id):return jsonify({"item_id": item_id})# 运行: python filename.py
if __name__ == '__main__':app.run(debug=True)
RESTful API 里没有方法定义,我如何判断它是增删改查?
RESTful API 通过 HTTP 方法 来区分操作,而不是通过 URL。例如:
| 方法 | 作用 | 示例 URL |
|---|---|---|
| GET | 获取数据 |
|
| POST | 创建数据 |
|
| PUT | 更新数据 |
|
| DELETE | 删除数据 |
|
如果 URL 里没有明确的增删改查,通常需要看 HTTP 方法(GET、POST、PUT、DELETE)来判断它的作用。
API 是不是就等于链接?
不完全正确。API(应用程序接口)可以包含但不等同于 URL,API 指的是一组规则和协议,不仅限于 HTTP,还可以是数据库 API、操作系统 API、函数库 API 等。API ≠ 网址,但 Web API 确实会以 URL 的形式暴露出来。
Web API:
GET https://api.example.com/users/1数据库 API(Java 代码):
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");操作系统 API(调用 Windows API):
#include <windows.h>
MessageBox(0, "Hello", "Message Box", MB_OK);
#### 应用层是客户端和服务器端都有的:
1. 应用层的定义
应用层是网络体系结构中的最高层,直接面向用户和应用程序,它负责处理高层协议,常见的应用层协议包括HTTP、FTP、SMTP、DNS等。客户端和服务器端的应用层,职责和运行环境不同。客户端应用层主要处理用户输入和界面呈现,而服务器端应用层主要处理业务逻辑和数据存储。两者通过网络协议(如HTTP)进行通信
-
客户端应用层: 运行在用户设备上的应用程序或进程,如Web浏览器、电子邮件客户端等。发送请求,并处理响应。例如,用户在浏览器中输入网址,浏览器作为客户端应用层,会向目标Web服务器发送HTTP请求,获取网页内容并呈现给用户。
-
服务器端应用层: 运行在服务器上的应用程序或服务,如Web服务器、邮件服务器等。接收并处理来自客户端的请求,返回相应的数据或服务。例如,Web服务器接收到浏览器的HTTP请求后,会处理该请求并返回相应的网页内容。
3. 应用层在客户端和服务器端的交互示例
以下是一个简单的HTTP请求-响应过程:
-
客户端(浏览器)发送HTTP请求:
GET /index.html HTTP/1.1 Host: www.example.com -
服务器(Web服务器)接收请求并返回响应:
HTTP/1.1 200 OK Content-Type: text/html<html> <head><title>Example Page</title></head> <body><h1>Welcome to Example.com!</h1> </body> </html>
**前端框架主要是针对于客户端而言的概念**
前端框架(如React、Vue)是用于构建用户界面的JavaScript框架,运行在客户端(浏览器)中。这些框架帮助开发者创建动态、交互式的网页应用。虽然服务器端也可以使用类似的框架(如Next.js、Nuxt.js)进行服务端渲染,但传统意义上的前端框架主要存在于客户端,用于处理用户界面和交互。
#### 缓存
缓存机制在应用层,而应用层是客户端和服务器端都有的:
-
客户端缓存:客户端应用程序可以在本地存储数据,以减少对服务器的请求次数,提高响应速度。例如,浏览器会缓存静态资源(如HTML、CSS、JavaScript文件),以加快页面加载速度。
-
服务器端缓存:服务器可以在内存中存储经常访问的数据或计算结果,以减少对底层数据库的访问,提高处理效率。例如,使用内存对象缓存(如Memcached,数据库缓存使用 Redis)来存储热点数据。
1. 浏览器缓存(HTTP 缓存)
示例:使用 Cache-Control 和 ETag 实现缓存控制 服务器端(Node.js 示例):
const http = require('http');
const crypto = require('crypto');// 模拟的资源数据
const resourceData = 'Hello, this is the resource content.';// 计算资源的 ETag(可以使用资源内容的哈希值)
const etag = crypto.createHash('md5').update(resourceData).digest('hex');const server = http.createServer((req, res) => {if (req.url === '/resource') {const ifNoneMatch = req.headers['if-none-match'];// 检查请求头中的 If-None-Match 是否与服务器的 ETag 匹配if (ifNoneMatch === etag) {// ETag 匹配,资源未修改,返回 304 Not Modifiedres.writeHead(304, {'Cache-Control': 'public, max-age=3600', // 缓存时间为 1 小时'ETag': etag,});res.end();} else {// ETag 不匹配,资源已修改,返回新的资源和 ETagres.writeHead(200, {'Content-Type': 'text/plain','Cache-Control': 'public, max-age=3600','ETag': etag,});res.end(resourceData);}} else {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('Not Found');}
});server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});
客户端(浏览器请求):
// 使用 Fetch API 请求资源
fetch('http://localhost:3000/resource').then((response) => {if (response.status === 200) {// 资源已更新,处理新的资源内容return response.text().then((data) => {console.log('Resource data:', data);});} else if (response.status === 304) {// 资源未修改,使用缓存中的数据console.log('Resource not modified. Using cached version.');}}).catch((error) => {console.error('Error fetching resource:', error);});
流程图解:
-
首次请求:客户端请求
http://localhost:3000/resource。服务器返回资源内容,状态码 200,并包含Cache-Control和ETag头。HTTP/1.1 200 OK Content-Type: text/plain Cache-Control: public, max-age=3600 ETag: "5d41402abc4b2a76b9719d911017c592"Hello, this is the resource content. -
后续请求(在缓存有效期内):客户端再次请求相同资源,并在请求头中包含
If-None-Match。服务器检查If-None-Match,发现资源未修改,返回 304 状态码,无需传输资源内容。客户端接收到 304 响应后,从缓存中读取并使用资源内容。 -
GET /resource HTTP/1.1 Host: localhost:3000 If-None-Match: "5d41402abc4b2a76b9719d911017c592"HTTP/1.1 304 Not Modified Cache-Control: public, max-age=3600 ETag: "5d41402abc4b2a76b9719d911017c592"
2. 应用层缓存示例:在 React 应用中使用 localStorage 缓存 API 响应数据
步骤:
-
首次加载应用时:检查
localStorage中是否存在缓存的新闻数据。如果存在且未过期,直接使用缓存的数据渲染界面。如果不存在或已过期,发送网络请求获取最新数据,渲染界面,并将数据缓存到localStorage。 -
在组件中实现:
import React, { useEffect, useState } from 'react';const NewsComponent = () => {const [news, setNews] = useState([]);const cacheKey = 'newsData';const cacheExpiry = 60 * 60 * 1000; // 缓存有效期:1 小时useEffect(() => {const fetchNews = async () => {try {const cachedData = localStorage.getItem(cacheKey);if (cachedData) {const { data, timestamp } = JSON.parse(cachedData);if (Date.now() - timestamp < cacheExpiry) {// 使用缓存的数据setNews(data);console.log('Using cached data');return;}}// 缓存不存在或已过期,发送网络请求const response = await fetch('https://api.example.com/news');const data = await response.json();setNews(data);// 将新数据缓存到 localStoragelocalStorage.setItem(cacheKey,JSON.stringify({ data, timestamp: Date.now() }));console.log('Fetched and cached new data');} catch (error) {console.error('Error fetching news:', error);}};fetchNews();}, []);return (<div><h1>Latest News</h1><ul>{news.map((item) => (<li key={item.id}>{item.title}</li>))}</ul></div>); };export default NewsComponent;
RESTful API 是改变服务器的资源,还是改变客户端的资源?
RESTful API 主要是用来操作服务器端的资源,而客户端的状态是如何随之变化的,取决于客户端如何使用 API 提供的数据。
-
服务器端资源的改变:通过
POST创建新资源等等,只有GET不会修改服务器端数 -
客户端状态:是指客户端的 UI、页面展示、数据缓存等。RESTful API 并不会直接管理客户端的状态,而是提供数据,让客户端自己决定如何更新其状态。例如:用户请求
GET /users/1,服务器返回用户数据,客户端用这个数据来更新页面(但服务器上的数据没有变)
REST 设计的无状态性(Stateless)是指:服务器不会存储客户端的会话状态,每个请求都是独立的,不依赖之前的请求。客户端必须在每个请求中提供所有必要的信息,例如身份认证(Token、Session ID 等)。服务器根据请求中的信息做出响应,而不会记住上一次请求的状态。
-
传统 Web 应用(有状态):用户登录后,服务器会在内存里保存用户会话,后续请求只需要提供一个
session_id。 -
RESTful API(无状态):每次请求都必须带上
Authorization头,服务器不会记住用户的身份,而是根据请求中的 Token 进行验证。
#### 筛选和分页
标准的 URL 查询参数不直接支持 OR 操作。需要看API服务器提供端究竟是怎么规定的。一种常见的解决方案是使用逗号分隔的列表表示多个值。
GET /classes?name=def,ABC
或者重复参数:
GET /classes?name=def&name=ABC
分页查询通常通过在 URL 中添加 page 和 size 参数来实现,分别表示页码和每页的数据量。
GET /classes?page=1&size=10
此请求表示获取第 1 页的数据,每页包含 10 条记录。如果有多页数据,可以调整 page 参数的值来获取不同页的数据。
GET /classes?page=2&size=10
此请求表示获取第 2 页的数据,每页同样包含 10 条记录。
某些 API 中,可能使用 offset 和 limit 参数来控制分页:此请求表示从第 11 条记录开始,获取 10 条记录。
GET /classes?offset=10&limit=10
相关文章:
HTTP 和RESTful API 基础,答疑
一文搞懂RESTful API - bigsai - 博客园 1. API 路径 开头必须 /,表示绝对路径,不支持 . 或 ..(相对路径)。API 结尾 / 通常不需要,但部分框架会自动处理 / → 无 /。 ✅ 推荐 GET /api/v1/products # 资源集合…...
【数据挖掘】深度挖掘
【数据挖掘】深度挖掘 目录:1. 减少样本集的数量知识点示例 2. 对噪声比集剪枝知识点示例建立局部树代码示例(使用 Python 和 scikit - learn 库构建局部决策树)代码解释注意事项 最大超平面定义原理求解方法代码示例(使用 Python…...
OpenGL(2)基于Qt做OpenGL开发
文章目录 一、基于Qt做OpenGL开发1、环境准备2、创建OpenGL窗口3、绘制基本图形 一、基于Qt做OpenGL开发 1、环境准备 确保你已经安装了 Qt 开发环境(包含 Qt Creator),并且支持 OpenGL 开发。在创建 Qt 项目时,选择 “Qt Widget…...
使用JWT实现微服务鉴权
目录 一、微服务鉴权 1、思路分析 2、系统微服务签发token 3、网关过滤器验证token 4、测试鉴权功能 前言: 随着微服务架构的广泛应用,服务间的鉴权与安全通信成为系统设计的核心挑战之一。传统的集中式会话管理在分布式场景下面临性能瓶颈和扩展性…...
高并发内存池项目介绍
💓博主CSDN主页:Am心若依旧409-CSDN博客💓 ⏩专栏分类:项目记录_⏪ 🚚代码仓库:青酒余成 🚚 🌹关注我🫵带你学习C 🔝🔝 1.前言 在经历一年多左右的时间…...
PHP会务会议系统小程序源码
📅 会务会议系统 一款基于ThinkPHPUniapp框架,精心雕琢的会议管理微信小程序,专为各类高端会议场景量身打造。它犹如一把开启智慧殿堂的金钥匙,为会议流程优化、开支精细化管理、数量精准控制、标准严格设定以及供应商严格筛选等…...
Java中的常用类 --String
学习目标 掌握String常用方法掌握StringBuilder、StringBuffer了解正则 1.String ● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型,也就是说String类中已经提前定义好了很多方法都是用来处理字符串的,所以Str…...
PWM(脉宽调制)技术详解:从基础到应用实践示例
PWM(脉宽调制)技术详解:从基础到应用实践示例 目录 PWM(脉宽调制)技术详解:从基础到应用实践示例学前思考:一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…...
Hutool - DB 连接池配置集成
在实际开发中,尤其是在高并发场景下,使用连接池来管理数据库连接是非常必要的,它可以显著提高数据库操作的性能和效率。Hutool - DB 支持集成多种常见的连接池,如 HikariCP、Druid 等。下面分别介绍如何将这两种连接池集成到 Huto…...
激光工控机在自动化生产线中有什么关键作用?
激光工控机作为自动化生产线的核心设备,通过高精度控制、快速响应和智能化集成,在提升效率、保障质量、实现柔性制造等方面发挥着不可替代的作用。以下是其关键作用的具体分析: 一、实现高效连续生产: 1.高速加工能力࿱…...
Visual Studio Code的下载安装与汉化
1.下载安装 Visual Studio Code的下载安装十分简单,在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了...
nlp|微调大语言模型初探索(3),qlora微调deepseek记录
前言 上篇文章记录了使用lora微调llama-1b,微调成功,但是微调llama-8b显存爆炸,这次尝试使用qlora来尝试微调参数体量更大的大语言模型,看看64G显存的极限在哪里。 1.Why QLora? QLoRA 在模型加载阶段通过 4-bit 量化大幅减少了模型权重的显存占用。QLoRA 通过 反量化到 …...
【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量
【全栈】SprintBootvue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】…...
基于ffmpeg+openGL ES实现的视频编辑工具(一)
在深入钻研音视频编辑开发这片技术海洋时,相信不少开发者都和我有同样的感受:网络上关于音视频编辑工具实现的资料繁多,理论阐释细致入微,代码片段也随处可见。然而,一个显著的缺憾是,缺乏一个完整成型的 A…...
面试完整回答:SQL 分页查询中 limit 500000,10和 limit 10 速度一样快吗?
首先:在 SQL 分页查询中,LIMIT 500000, 10 和 LIMIT 10 的速度不会一样快,以下是原因和优化建议: 性能差异的原因 LIMIT 10: 只需要扫描前 10 条记录,然后返回结果。 性能非常高,因为数据库只…...
Linux系统管理(十六)——通过WSL配置windows下的Linux系统(可视化界面与远程连接)
前言 WSL,即Windows Subsystem for Linux,是微软在Windows 10和Windows 11中引入的功能,允许用户在Windows上原生运行Linux的命令行工具和应用程序,无需启动完整的Linux虚拟机或进行双系统启动。 开启WSL服务 开启虚拟化 进入…...
【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?
在分布式系统中,RabbitMQ 自身不直接提供消息幂等性保障机制,但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践: 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一IDÿ…...
flutter在安卓模拟器上运行
目录 下载android studio,然后把其中的模拟器设为环境变量,然后在vscode/cursor中使用插件,打开安卓模拟器一、下载android studio网址mac 下载64位 ARM 二、启动android studio三、设置SDK四、打开文件 打开模拟器五、运行程序六、在vscode/…...
linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现: 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后,Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...
与本地电脑PDF文档对话的PDF问答程序
文章目录 PDF问答程序程序流程处理PDF文档创建问答链 在探索和学习新技术时,了解LangChain框架的理论知识固然重要,但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作,你可…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
