GET与POST请求:核心区别与最佳实践
1. HTTP请求基础GET与POST的本质区别在Web开发领域GET和POST是HTTP协议中最常用的两种请求方法。作为从业15年的全栈开发者我见过太多因为混淆两者特性而导致的系统问题。让我们先看一个真实案例某电商平台曾因错误使用GET请求提交订单导致用户重复下单时浏览器缓存直接提交了相同参数造成数百万损失。GET请求的本质是获取它设计用于安全且幂等的操作。安全意味着不应修改服务器状态幂等代表多次执行结果相同。实际表现为参数通过URL明文传输形如?key1value1key2value2有长度限制不同浏览器2083~8000字符不等会被浏览器缓存和历史记录保存POST请求则是为提交而生适用于非幂等操作参数放在请求体body中传输无严格长度限制不会被浏览器主动缓存支持多种编码类型application/x-www-form-urlencoded、multipart/form-data等关键经验在RESTful架构中GET对应读取ReadPOST对应创建Create。误用会导致API语义混乱和安全风险。2. 发送普通参数的技术实现2.1 GET请求参数处理原生JavaScript的实现方案// 传统URL拼接方式 const params new URLSearchParams({ user: dev123, page: 1, filter: active }); const url https://api.example.com/users?${params}; // 使用fetch发起请求 fetch(url) .then(response response.json()) .then(data console.log(data));常见问题及解决方案特殊字符处理使用encodeURIComponent()对参数值编码const safeValue encodeURIComponent(特殊字符#$);数组参数需要约定格式常见如?ids[]1ids[]2 或 ?ids1,2缓存问题添加时间戳参数避免缓存const timestamp Date.now();2.2 POST请求参数处理2.2.1 x-www-form-urlencoded格式这是HTML表单默认的提交方式const formData new URLSearchParams(); formData.append(username, web_user); formData.append(password, s3cret); fetch(https://api.example.com/login, { method: POST, headers: { Content-Type: application/x-www-form-urlencoded, }, body: formData });2.2.2 multipart/form-data格式适合文件上传场景const formData new FormData(); formData.append(avatar, fileInput.files[0]); formData.append(comment, 用户头像); fetch(https://api.example.com/upload, { method: POST, body: formData // 注意不要手动设置Content-Type头浏览器会自动添加boundary });3. 高级应用场景与性能优化3.1 大规模参数处理技巧当参数数量超过100个时建议GET请求考虑改用POST避免URL过长问题POST优化对重复键名使用数组格式数值型参数进行压缩如用1/0代替true/false启用HTTP压缩gzip实测数据对比参数规模原始大小压缩后传输时间500字段12KB2.1KB减少78%3.2 安全加固方案敏感数据防护绝对不要用GET传输密码、token等POST也应使用HTTPS加密考虑二次加密关键参数CSRF防护// 服务端生成并返回token fetch(/api/csrf-token) .then(res res.json()) .then(data { localStorage.setItem(csrf_token, data.token); }); // 后续请求携带token fetch(/api/sensitive-action, { method: POST, headers: { X-CSRF-Token: localStorage.getItem(csrf_token) } });4. 调试与问题排查指南4.1 常用调试工具浏览器开发者工具Network面板查看原始请求右键请求 → Copy → Copy as cURL命令行测试# GET请求测试 curl -X GET https://api.example.com/data?id123 # POST表单测试 curl -X POST -d usertestpwd123 https://api.example.com/login4.2 典型错误代码状态码常见原因解决方案400参数格式错误检查Content-Type与body匹配404端点不存在验证URL路径和HTTP方法413请求体过大分批次发送或压缩数据415不支持的媒体类型修正Content-Type头4.3 真实案例解析某金融系统遇到的参数问题现象POST请求偶尔丢失参数排查发现Nginx配置了client_max_body_size 1m当用户上传Base64图片时超限解决# 调整nginx配置 client_max_body_size 10m;5. 现代前端框架的最佳实践5.1 React中的实现使用axios库的推荐方式// GET请求 axios.get(/api/user, { params: { ID: 12345 } }); // POST请求 axios.post(/api/user, { firstName: Fred, lastName: Flintstone }, { headers: { Authorization: Bearer xxx } });5.2 Vue 3组合式APIimport { ref } from vue; import axios from axios; const userData ref(null); const fetchUser async () { try { const response await axios({ method: post, url: /api/login, data: { username: vue3, password: composition }, params: { locale: zh-CN } }); userData.value response.data; } catch (error) { console.error(请求失败:, error); } };5.3 性能优化技巧请求合并// 批量获取用户数据 axios.post(/api/users/batch, { ids: [1, 2, 3, 4] });本地缓存策略const cache new Map(); async function getWithCache(url) { if (cache.has(url)) { return cache.get(url); } const response await fetch(url); const data await response.json(); cache.set(url, data); return data; }6. 服务端处理规范6.1 Node.js (Express) 示例const express require(express); const bodyParser require(body-parser); const app express(); // 必须的中间件 app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // 处理GET参数 app.get(/api/search, (req, res) { const { q, page 1 } req.query; // 参数验证 if (!q) return res.status(400).json({ error: 缺少查询参数 }); // 业务逻辑... }); // 处理POST参数 app.post(/api/users, (req, res) { const { name, email } req.body; // 数据验证库推荐joi或zod if (!validateEmail(email)) { return res.status(422).json({ error: 邮箱格式无效 }); } // 数据库操作... });6.2 Spring Boot (Java) 示例RestController RequestMapping(/api) public class UserController { GetMapping(/users) public ResponseEntity? getUsers( RequestParam(required false) Integer page, RequestParam(required false) Integer size) { // 分页逻辑处理 } PostMapping(/users) public ResponseEntityUser createUser( RequestBody Valid UserDTO userDto) { // 自动参数验证 } }6.3 参数验证要点基础验证必填字段检查数据类型校验长度/范围限制业务验证关联数据一致性权限校验业务规则符合性安全验证XSS过滤SQL注入防护敏感词过滤7. 移动端开发特别注意事项7.1 Android (Kotlin) 实现使用Retrofit的推荐方式interface ApiService { GET(users) suspend fun getUsers( Query(page) page: Int, Query(size) size: Int 20 ): ResponseListUser FormUrlEncoded POST(auth/login) suspend fun login( Field(email) email: String, Field(password) password: String ): ResponseAuthToken }7.2 iOS (Swift) 实现struct UserRequest: Encodable { let name: String let email: String } func postUser() { let url URL(string: https://api.example.com/users)! var request URLRequest(url: url) request.httpMethod POST request.setValue(application/json, forHTTPHeaderField: Content-Type) let body UserRequest(name: iOS Dev, email: devapple.com) request.httpBody try? JSONEncoder().encode(body) URLSession.shared.dataTask(with: request) { data, response, error in // 处理响应 }.resume() }7.3 移动端优化策略弱网处理设置合理超时建议15-30秒实现自动重试机制支持断点续传数据压缩// Android使用GZIP val request Request.Builder() .url(url) .header(Content-Encoding, gzip) .post(gzip(body)) .build()本地缓存响应头设置Cache-Control实现ETag/Last-Modified验证8. 自动化测试方案8.1 Postman测试集合推荐测试用例设计GET请求验证参数缺失测试边界值测试特殊字符测试POST请求验证空body提交超大body测试错误Content-Type测试8.2 Jest单元测试示例const axios require(axios); const MockAdapter require(axios-mock-adapter); describe(API请求测试, () { let mock; beforeEach(() { mock new MockAdapter(axios); }); test(GET带参数请求, async () { mock.onGet(/search, { params: { q: test } }) .reply(200, { results: [] }); const res await axios.get(/search, { params: { q: test } }); expect(res.status).toBe(200); }); test(POST参数验证, async () { mock.onPost(/login, { user: admin, pwd: 123 }) .reply(200, { token: xyz }); const res await axios.post(/login, { user: admin, pwd: 123 }); expect(res.data.token).toBeDefined(); }); });8.3 压力测试要点使用JMeter进行性能测试时GET请求关注URL长度对性能影响测试缓存命中率POST请求不同body大小对TPS的影响连接池配置优化测试结果分析维度平均响应时间错误率吞吐量资源占用率9. 前沿技术与未来演进9.1 GraphQL的替代方案与传统REST对比# 查询示例 query { user(id: 123) { name email posts(limit: 5) { title } } } # 变更示例 mutation { createUser(input: { name: GraphQL User email: gqlexample.com }) { id createdAt } }优势比较减少请求次数精确获取所需字段强类型 schema9.2 WebSocket实时通信适合场景实时数据推送高频小数据量交互双向通信需求const socket new WebSocket(wss://api.example.com/realtime); socket.onmessage (event) { console.log(收到消息:, event.data); }; // 发送参数 socket.send(JSON.stringify({ action: subscribe, channel: notifications }));9.3 HTTP/2与HTTP/3改进HTTP/2特性多路复用一个连接并行多个请求头部压缩HPACK算法服务器推送HTTP/3革新基于QUIC协议UDP改进的拥塞控制0-RTT握手10. 架构设计建议10.1 微服务API网关关键配置# Kong网关示例配置 services: - name: user-service url: http://user-service routes: - name: user-get paths: [/users] methods: [GET] - name: user-create paths: [/users] methods: [POST] plugins: - name: rate-limiting config: minute: 100 - name: request-transformer config: add: headers: [X-Request-Time: $timestamp]10.2 分布式追踪实现OpenTelemetry集成const { NodeTracerProvider } require(opentelemetry/sdk-trace-node); const { SimpleSpanProcessor } require(opentelemetry/sdk-trace-base); const { JaegerExporter } require(opentelemetry/exporter-jaeger); const provider new NodeTracerProvider(); provider.addSpanProcessor( new SimpleSpanProcessor( new JaegerExporter({ endpoint: http://jaeger:14268/api/traces, }) ) ); provider.register();10.3 服务网格治理Istio流量管理示例apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: user-service spec: hosts: - users.prod.svc.cluster.local http: - match: - method: exact: GET route: - destination: host: users.prod.svc.cluster.local subset: v1 - match: - method: exact: POST route: - destination: host: users.prod.svc.cluster.local subset: v211. 安全防护进阶11.1 参数注入防护防御措施输入过滤// 过滤HTML标签 function sanitize(input) { return input.replace(/[^]*?/gm, ); }参数化查询// SQL参数化示例 db.query(SELECT * FROM users WHERE id ?, [userId]);CSP策略Content-Security-Policy: default-src self11.2 速率限制实现Redis Express中间件const rateLimit require(express-rate-limit); const RedisStore require(rate-limit-redis); const limiter rateLimit({ store: new RedisStore({ redisURL: redis://localhost:6379 }), windowMs: 15 * 60 * 1000, // 15分钟 max: 100, // 每个IP限制100次请求 keyGenerator: (req) { return ${req.ip}:${req.method}:${req.path}; } }); app.use(/api/, limiter);11.3 敏感数据保护加密方案建议传输层强制HTTPSHSTS头证书固定Public-Key-Pins应用层敏感字段单独加密使用JWE而非JWT存储层使用KMS管理密钥实施字段级加密12. 性能监控与分析12.1 关键指标采集需要监控的核心指标请求成功率2xx/3xx/4xx/5xx比例响应时间分布P50/P90/P99吞吐量RPS错误类型分布12.2 Prometheus配置示例scrape_configs: - job_name: node_app metrics_path: /metrics static_configs: - targets: [app:3000] relabel_configs: - source_labels: [__meta_kubernetes_pod_name] target_label: pod12.3 日志结构化方案ELK栈日志格式{ timestamp: 2023-07-20T08:45:32Z, method: POST, path: /api/login, status: 200, duration_ms: 128, params: { username: ***, ip: 192.168.1.100 }, trace_id: abc123 }13. 全球化与本地化13.1 多语言参数处理最佳实践Accept-Language头GET /api/products HTTP/1.1 Accept-Language: zh-CN,zh;q0.9,en;q0.8URL参数方式/api/products?langzh_CN内容协商// Express实现 app.get(/products, (req, res) { const lang req.acceptsLanguages(en, zh) || en; res.json(getLocalizedProducts(lang)); });13.2 时区处理方案推荐做法前端传递时区Intl.DateTimeFormat().resolvedOptions().timeZone数据库存储TIMESTAMP WITH TIME ZONEAPI响应{ event_time: 2023-07-20T12:00:00Z, timezone: Asia/Shanghai }14. 文档与协作规范14.1 OpenAPI规范示例paths: /users: get: summary: 获取用户列表 parameters: - in: query name: page schema: type: integer required: false - in: query name: size schema: type: integer required: false post: summary: 创建新用户 requestBody: required: true content: application/json: schema: $ref: #/components/schemas/User components: schemas: User: type: object properties: name: type: string email: type: string format: email required: - name - email14.2 团队协作建议命名约定GET参数蛇形命名user_idPOST字段驼峰命名userId版本控制URL路径版本/v1/users头信息版本Accept: application/vnd.api.v1json变更管理兼容性保证弃用通知文档同步15. 遗留系统改造策略15.1 从传统表单到RESTful改造步骤方法转换查询 → GET创建 → POST更新 → PUT/PATCH删除 → DELETE状态码规范化成功创建201无内容204验证失败422错误响应标准化{ error: { code: invalid_email, message: 邮箱格式不正确, target: email } }15.2 灰度发布方案Nginx配置示例# 按比例分流 split_clients ${remote_addr}${http_user_agent} $variant { 50% v1; 50% v2; } server { location /api { proxy_pass http://user-service-$variant; } }16. 特殊场景处理16.1 大文件分块上传前端实现async function uploadFile(file) { const chunkSize 5 * 1024 * 1024; // 5MB const chunks Math.ceil(file.size / chunkSize); for (let i 0; i chunks; i) { const start i * chunkSize; const end Math.min(start chunkSize, file.size); const chunk file.slice(start, end); await fetch(/api/upload, { method: POST, headers: { Content-Range: bytes ${start}-${end-1}/${file.size}, X-File-Id: fileId }, body: chunk }); } }16.2 长轮询与SSE服务器发送事件示例// 服务端 app.get(/api/events, (req, res) { res.setHeader(Content-Type, text/event-stream); const timer setInterval(() { res.write(data: ${JSON.stringify({time: Date.now()})}\n\n); }, 1000); req.on(close, () clearInterval(timer)); }); // 客户端 const eventSource new EventSource(/api/events); eventSource.onmessage (e) { console.log(收到事件:, JSON.parse(e.data)); };17. 调试技巧与工具链17.1 Chrome开发者工具高级用法重放请求Network面板 → 右键请求 → Copy → Copy as fetch修改后直接在Console执行断点调试Sources面板 → XHR/fetch Breakpoints添加URL包含规则性能分析Performance面板记录网络请求时序查看Waterfall图表分析瓶颈17.2 命令行调试大全cURL高级用法# 显示详细请求过程 curl -v -X POST https://api.example.com/login # 保存和发送Cookie curl -c cookies.txt -b cookies.txt https://example.com # 测试不同HTTP版本 curl --http1.1 https://example.com curl --http2 https://example.com # 限速测试 curl --limit-rate 100K https://example.com/large-file18. 前沿研究与发展趋势18.1 WebTransport新协议特性对比特性HTTP/2WebSocketWebTransport多路复用✓✗✓不可靠传输✗✗✓底层协议TCPTCPQUIC18.2 边缘计算场景Cloudflare Workers示例addEventListener(fetch, event { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { // 在边缘节点处理请求 const params new URL(request.url).searchParams; const name params.get(name) || World; return new Response(JSON.stringify({ message: Hello ${name} from ${request.cf.colo} }), { headers: { Content-Type: application/json } }); }19. 性能基准测试数据19.1 不同语言处理性能测试环境处理10万次简单请求语言/框架平均延迟最大RPS内存占用Node.js12ms8,500120MBGo (net/http)3ms32,00045MBSpring Boot28ms4,200310MBPython Flask65ms1,80090MB19.2 序列化格式对比测试数据包含50个字段的对象格式大小编码时间解码时间JSON2.1KB0.8ms1.2msMessagePack1.3KB0.6ms0.9msProtobuf0.9KB0.4ms0.7ms20. 终极检查清单在部署前务必验证GET请求[ ] 参数是否做了URL编码[ ] 敏感数据是否出现在URL中[ ] 浏览器缓存策略是否合理POST请求[ ] Content-Type头是否正确设置[ ] 请求体大小限制是否适当[ ] 是否实施了CSRF防护通用检查[ ] 输入验证是否完备[ ] 错误处理是否友好[ ] 日志是否包含足够信息[ ] 性能监控是否到位最后分享一个真实教训某次我们忘记在登录接口限制请求频率导致被恶意刷接口消耗了大量短信资源。现在我们的标准做法是对所有公共API默认启用速率限制关键操作添加二次验证。这些经验往往只有踩过坑才能真正体会其价值。

相关新闻

Unity引擎学习路径全解析:从入门到进阶的四个关键阶段

Unity引擎学习路径全解析:从入门到进阶的四个关键阶段

1. 从零到一:Unity引擎的宏观认知与学习路径总览当你第一次双击打开Unity Hub,看到那个深蓝色的启动界面时,可能既兴奋又迷茫。兴奋的是,一个能创造《原神》、《王者荣耀》这类作品的神奇工具就在眼前;迷茫的是&#x…

2026/8/5 20:11:07 阅读更多 →
boost_control.c

boost_control.c

/********************************************************************************* file boost_control.c* brief 简化 Boost 开环/闭环 PI 控制实现。*******************************************************************************/#include "boost_control.h&…

2026/8/4 11:45:47 阅读更多 →
FPGA矩阵乘法器设计:从Verilog实现到架构优化

FPGA矩阵乘法器设计:从Verilog实现到架构优化

1. 项目概述:为什么要在FPGA上实现矩阵乘法?如果你接触过数字信号处理、图像处理或者机器学习加速,那“矩阵乘法”这个词对你来说肯定不陌生。它是这些领域的核心运算,计算量巨大。在通用处理器(CPU)上跑大…

2026/8/4 11:45:56 阅读更多 →

最新新闻

Shader代码的“觉醒之旅“:从解析完成到GPU执行的全过程

Shader代码的“觉醒之旅“:从解析完成到GPU执行的全过程

引子:一个让人"细思极恐"的问题 想象你已经走过了Shader的前半段旅程。 你知道: **你写的Shader文件——被ShaderImporter读进内存ShaderLab被解析、HLSL被提取、include被展开代码被ShaderCompiler翻译成中间格式最终打包成游戏里的一份数据 …

2026/8/5 20:46:11 阅读更多 →
Shader文件的“奇幻旅程“:从磁盘到GPU的完整加载之路

Shader文件的“奇幻旅程“:从磁盘到GPU的完整加载之路

引子:一个让新手"想都没想过"的问题 想象你是一个刚学Unity一段时间的开发者。 你写了一个漂亮的Shader——在Inspector里拖上贴图、调好参数——运行游戏——屏幕上瞬间出现绚丽的画面——你满意地点头:“完美!” **但如果这时——…

2026/8/5 20:46:11 阅读更多 →
Queue与RenderType:Unity渲染世界的“交通指挥官“与“身份识别码“

Queue与RenderType:Unity渲染世界的“交通指挥官“与“身份识别码“

引子:一场"混乱的十字路口"到"井然有序"的变革 想象你是一座繁华都市的交通指挥官。 **这座城市里——每天有数十万辆车穿行——公交车、私家车、出租车、救护车、消防车、垃圾清运车……——每一辆车都想开到自己的目的地。 问题来了&#xff…

2026/8/5 20:46:11 阅读更多 →
IPATool:如何用命令行工具安全高效地获取iOS应用包文件?

IPATool:如何用命令行工具安全高效地获取iOS应用包文件?

IPATool:如何用命令行工具安全高效地获取iOS应用包文件? 【免费下载链接】ipatool Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store 项目地址: https://gitcode.com/GitHub_Trend…

2026/8/5 20:46:11 阅读更多 →
Unity Input System实现3D模型手势交互:旋转与缩放功能开发指南

Unity Input System实现3D模型手势交互:旋转与缩放功能开发指南

1. 项目概述:为什么需要手势交互?在移动端和触屏设备上浏览3D模型,手势操作几乎是唯一自然且高效的交互方式。想象一下,你打开一个产品展示应用,想看看新款手机的3D模型,如果只能用屏幕上的虚拟按钮来旋转、…

2026/8/5 20:46:11 阅读更多 →
nlohmann/json 深度解析:让 C++ 解析 JSON 像喝水一样简单

nlohmann/json 深度解析:让 C++ 解析 JSON 像喝水一样简单

一、nlohmann/json 是什么? 一句话:nlohmann/json(官方名 JSON for Modern C)是 C 生态里最"亲民"的开源 JSON 解析库,由德国开发者 Niels Lohmann 维护,GitHub 上 star 数接近 5 万&#xff0c…

2026/8/5 20:45:11 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →