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 # 资源集合…...
手写简易RPC(实践版)
首先了解rpc rpc-远程过程调用,openFeign,Dubbo都可以算作rpc,以微服务来具体说明,就是在本地不需要去发送请求,通过rpc框架,像调用本地方法一样调用其他服务的方法,本质上还是要经过网络&…...
Day6 25/2/19 WED
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p4&v…...
【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
目录 一 核心概念与背景 二 输出层知识蒸馏 1 教师模型训练 2 软标签生成(Soft Targets) 3 学生模型训练 三 扩展 1 有效性分析 2 关键影响因素 3 变体 一 核心概念与背景 知识蒸馏(Knowledge Distillation, KD)是一种模…...
机器学习PCA和LDA
主成分分析(PCA, Principal Component Analysis)和线性判别分析(LDA, Linear Discriminant Analysis)是两种常用的降维方法,它们虽然都用于数据降维,但核心思想和应用场景不同。 PCA(主成分分析…...
tcp协议连接,和传输数据
1、连接 这个是通用的 2、传送数据 当连接建立后,客户端和服务器都可以主动发送数据,分别如下 1》客户端先发送数据 这里是单向的,服务器没有对客户端的数据内容进行应答,只是单纯的对报文应答ack 2》服务器先发送数据...
【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示
异常问题: 这个是在新版的pycharm中出现的,出现的问题,点击view后不全部显示,而是以...折叠显示 在setting中这么设置一下就好了: 解决办法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…...
Java基础——代理模式
代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 一、代理模式的主要作用 控制访问:通…...
解锁机器学习核心算法|主成分分析(PCA):降维的魔法棒
一、引言 在机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向…...
sql注入漏洞
目录 一、SQL注入概述 例子背景 正常情况下的查询 SQL注入攻击 利用优先级进行攻击 二、解决SQL注入 使用PreparedStatement接口 步骤和方法 1. 创建PreparedStatement对象 2. 向占位符传入值 3. 执行SQL语句 示例 总结 SQL 注入是一种常见的网络攻击手段。通俗来…...
spring微服务+dubbo框架,某一服务启动时提示多个bean存在
在java的springboot项目中使用DubboService的注解的实现类中,在引用本模块的类时,使用的DubboRefrence注解,在启动项目时报错,提示该类需要以一个bean对象,但是存在了两个,把DubboRefrence的注解改成Autowi…...
React useState 和 useEffect 使用坑点注意总结
React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…...
使用rknn进行yolo11-pose部署
文章目录 概要生成ONNX生成RKNN实测效果概要 使用 RKNN 进行 YOLOv11 Pose 部署的必要性在于,RKNN 能将 YOLOv11 Pose 模型转化为适合 Rockchip 硬件平台(如 RV1109、RV1126)执行的格式,充分利用其 AI 加速功能,显著提高推理速度和效率。此外,RKNN 提供模型优化(如量化…...
开源语音克隆项目 OpenVoice V2 本地部署
#本机环境 WIN11 I5 GPU 4060ti 16G 内存 32G #开始 git clone https://github.com/myshell-ai/OpenVoice.git conda create -n opvenv python3.9 -y conda activate opvenv pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/…...
YOLOv12从入门到入土(含结构图)
论文链接:https://arxiv.org/abs/2502.12524 代码链接:https://github.com/sunsmarterjie/yolov12 文章摘要: 长期以来,增强YOLO框架的网络架构一直至关重要,但一直专注于基于cnn的改进,尽管注意力机制在建…...
8.【线性代数】——求解Ax=b
八 求解Axb 1. 解Axb求特解 x p x_p xp求特解 x n x_n xn所有解 2. Axb什么时候有解3. A m ∗ n A_{m * n} Am∗n不同秩的Axb解分析3.1 列满秩 rn<m3.2 行满秩 rm<n3.3 rmn3.4 r<m 且 r < n3.5 综述 1. 解Axb 求解 { x 1 2 x 2 2 x 3 2 x 4 b 1 2 x 1…...
【Quest开发】全身跟踪
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 最终效果:能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势,实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …...
Spring Boot 示例项目:从零开始构建 Web 应用
一、项目概述 本文档将指导您通过一个示例项目,了解如何使用 Spring Boot 框架构建一个简单的 Web 应用程序。该项目涵盖了从数据模型定义到控制器、服务层以及数据访问层的完整开发流程,帮助您快速掌握 Spring Boot 的基本使用方法。 二、项目结构 1. 项目模块 本示例项…...
Windows 启动 SSH 服务报错 1067
Windows 启动 SSH 服务报错 1067 一、原本安装的 Windows 自带的 SSH 服务 按 Windows 键 -> 设置 -> 系统 -> 可选功能 在 添加的功能 查看是否安装了 OpenSSH 服务 一开始 执行 net start sshd 是可以正常启动的 并且其他机器也可以通过 ssh 访问 这个电脑 但是有…...
【AI战略思考15】我对做自媒体视频博主的初步探索和一些思考
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 导言 因为自己找工作可能没那么快和顺利,事实是比我之前想象的要难很多,所以这几天探索了下自己能否尝试做自媒体或者视频博主来尝试赚点钱,如果做…...
零基础学QT、C++(一)安装QT
目录 如何快速学习QT、C呢? 一、编译器、项目构建工具 1、编译器(介绍2款) 2、项目构建工具 二、安装QT 1、下载QT安装包 2、运行安装包 3、运行QT creator 4、导入开源项目 总结 闲谈 如何快速学习QT、C呢? 那就是项目驱动法&…...
Word接入DeepSeek(API的作用)
1.打开”Word”,点击“文件”。 2.点击“选项”。 3.点击“信任中心”——“信任中心设置”。 4. 勾选”启用所有宏“,点击”确定“。 5.点击“自定义功能区”,勾选上“开发工具”,点击“确定”。 6.返回“文件——开发工具“下的…...
ok113i——交叉编译音视频动态库
提示:buildroot支持ffmpeg和SDL,但博主的ffmpeg是按下面方法编译通过,SDL使用buildroot直接编译也通过; 1. 下载ffmpeg源码 下载链接:https://github.com/FFmpeg/FFmpeg/tags 根据版本需要自行下载压缩包,…...
CSS中五种定位方式(position)对比分析
在 CSS 中,定位方式(position)决定了元素如何相对于其参照物进行定位,同时影响文档流的布局。以下是五种定位方式的对比、参照物说明及代码示例: 1. position: static(默认定位) 参照物&#x…...
Jest单元测试
由于格式和图片解析问题,可前往 阅读原文 前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序 单元测试(Unit Testi…...
Lineageos 22.1(Android 15) 开机向导制作
一、前言 开机向导原理其实就是将特定的category的Activity加入ComponentResolver,如下 <category android:name"android.intent.category.SETUP_WIZARD"/>然后我们开机启动的时候,FallbackHome结束,然后启动Launcher的时候…...
前沿计组知识入门
这份PDF文件是一份关于计算机体系结构的讲义,涵盖了从基础概念到高级主题的多个方面。以下是详细的总结和分析: 计算机体系结构概述 定义:计算机体系结构是计算机系统的理论组成部分,根据其属性和功能进行划分,包括计…...
力扣 最长递增子序列
动态规划,二分查找。 题目 由题,从数组中找一个最长子序列,不难想到,当这个子序列递增子序列的数越接近时是越容易拉长的。从dp上看,当遍历到这个数,会从前面的dp选一个最大的数加上当前数,注意…...
在项目中调用本地Deepseek(接入本地Deepseek)
前言 之前发表的文章已经讲了如何本地部署Deepseek模型,并且如何给Deepseek模型投喂数据、搭建本地知识库,但大部分人不知道怎么应用,让自己的项目接入AI模型。 文末有彩蛋哦!!! 要接入本地部署的deepsee…...
已解决IDEA无法输入中文问题(亲测有效)
前言 在使用IDEA的时候,比如我们想写个注释,可能不经意间,输入法就无法输入中文了,但是在其他地方打字,输入法仍然能够正常工作。这是什么原因呢,这篇文章带你解决这个问题! 快捷键 如果你的I…...
Java 语法新特性(Records、Pattern Matching、Sealed Classes)深度解析(11/17/21)✨
一、Records(Java 16) 📝 核心价值:简化不可变数据载体的定义 // 传统POJO vs Record public record User(String name, int age) {} // 自动生成:构造方法/equals()/hashCode()/toString() User user new User(&qu…...
书评与笔记:《如何有效报告Bug》
文章目录 书评笔记核心原则1. 首要目标:让程序员亲眼看到问题2. 次要目标:详细描述问题3. 保持冷静,避免误操作4. 提供额外信息5. 清晰、准确地表达 实用建议不要自作聪明地诊断问题类比:看医生时的症状描述程序员的心理 总结 原文…...
Node.js 中的 fs 模块详解
fs(File System)模块是 Node.js 的核心模块之一,用于处理文件系统的操作,包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式,适用于不同的场景。 1. 前置知识 1.1 文件系统 文件系统是操作系统…...
【深度学习】如何一步步实现SGD随机梯度下降算法
如何一步步实现SGD随机梯度下降算法 文章目录 如何一步步实现SGD随机梯度下降算法SGD随机梯度下降算法的作用MNIST_SAMPLE数据集SGD算法的七大步骤Step1. 初始化模型参数Step2. 计算预测值predictionsStep3. 计算损失lossStep4. 计算梯度gradientsStep5. 更新模型参数Step6. 重…...
Android Hal AIDL 简介 (一)
Android 接口定义语言 (AIDL) 是一款可供用户用来抽象化 IPC 的工具。 以在 .aidl 文件中指定的接口为例,各种构建系统都会使用 aidl 二进制文件构造 C++ 或 Java 绑定,以便跨进程使用该接口(无论其运行时环境或位数如何)。 AIDL 可以在 Android 中的任何进程之间使用:在…...
【数据分析】2.数据分析业务全流程
业务流程方法论:3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标:系统性地解决商业中的关键问题框架:分为三个阶段,每个阶段包含两个步骤适用场景:适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…...
如何使用Spark SQL进行复杂的数据查询和分析
使用Spark SQL进行复杂的数据查询和分析是一个涉及多个步骤和技术的过程。以下是如何使用Spark SQL进行复杂数据查询和分析的详细指南: 一、准备阶段 环境搭建: 确保已经安装并配置好了Apache Spark环境。准备好数据源,可以是CSV文件、JSON…...
【Spring+MyBatis】_图书管理系统(下篇)
图书管理系统上篇、中篇如下: 【SpringMyBatis】_图书管理系统(上篇)-CSDN博客 【SpringMyBatis】_图书管理系统(中篇)-CSDN博客 目录 功能5:删除图书 6.1 约定前后端交互接口 6.2 后端接口 6.3 前端…...
goland无法debug项目
1、其实个原因是因为正在使用的Delve调试器版本太旧,无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具,用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本,而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...
001-监控你的文件-FSWatch-C++开源库108杰
fswatch 原理与应用简介fswatch 安装fswatch 实践应用具体应用场景与细节补充 1. 简介 有些知识,你知道了不算厉害,但你要是不知道,就容易出乱。 很多时候,程序需要及时获取磁盘上某个文件对象(文件夹、文件࿰…...
leetcode203.移除链表元素
目录 问题描述示例提示 具体思路思路一思路二 代码实现 问题描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 题目链接:移除链表元素 示例 提示 列表中的节点数目在范围…...
代码随想录算法训练营第六天| 242.有效的字母异位词 、349. 两个数组的交集、202. 快乐数 、1. 两数之和
242.有效的字母异位词 题目链接:242.有效的字母异位词 文档讲解:代码随想录有效的字母异位词 视频讲解:LeetCode:有效的字母异位词 状态:学会了 思路: 数组其实是简单哈希表。 哈希表用来快速判断元素是否在…...
DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门
1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second,每秒浮点运算次数,用来衡量硬件性能。 FLOPs:floating point of operations,是浮点运算次数,用来衡量算法、模型的复杂度。 GFLOPSÿ…...
rknn 板端运行程序Invalid RKNN model version 6, Meet unsupported rknn target type
E RKNN: [09:15:53.053] 6, 1 E RKNN: [09:15:53.053] Invalid RKNN model version 6 E RKNN: [09:15:53.053] rknn_init, load model failed! [NN_ERROR] rknn_init fail! ret-1 或者报错: E RKNN: [08:35:30.804] Meet unsupported target type: 0x46495247 E…...
Linux 内核中的 container_of 宏:以 ipoib_rx_poll_rss 函数为例
在 Linux 内核编程中,container_of 是一个非常实用的宏,主要用于通过结构体的成员指针来获取包含该成员的整个结构体的指针。rx_ring = container_of(napi, struct ipoib_recv_ring, napi); 在代码中就是利用了这个宏,下面我们详细分析它的作用和工作原理。 背景知识 在内…...
【数据结构-红黑树】
文章目录 红黑树红黑树介绍红黑树的五个基本性质红黑树的平衡原理红黑树的操作红黑树的操作 代码实现节点实现插入和查询操作 红黑树 红黑树介绍 红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree, BST)&…...
一个简洁高效的Flask用户管理示例
Flask-Login 是 Flask 的用户管理扩展,提供 用户身份验证、会话管理、权限控制 等功能。 适用于: • 用户登录、登出 • 记住用户(“记住我” 功能) • 限制未登录用户访问某些页面 • 用户会话管理 1. 安装 Flask-Login pi…...
用Nginx打造防盗链护盾
用Nginx打造防盗链护盾 一、你的网站正在"为他人做嫁衣"? 想象一下这个场景: 你精心拍摄的摄影作品、录制的课程视频、设计的原创素材,被其他网站直接盗用链接。 更气人的是——当用户在他们网站查看这些资源时,消耗的…...
VS Code 如何搭建C/C++开发环境
目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…...
DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由
为了让大家实现 DeepSeek 使用自由,今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版:DeepSeek官网与APP 首推,肯定是 DeepSeek 的官网和 APP,可以使用满血版 R1 和 V3 模型,以及联网功能。 网址: htt…...