【JavaScript-Day 48】告别 Ajax,拥抱现代网络请求:Fetch API 完全指南

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

01-【JavaScript-Day 1】从零开始:全面了解 JavaScript 是什么、为什么学以及它与 Java 的区别
02-【JavaScript-Day 2】开启 JS 之旅:从浏览器控制台到 <script> 标签的 Hello World 实践
03-【JavaScript-Day 3】掌握JS语法规则:语句、分号、注释与大小写敏感详解
04-【JavaScript-Day 4】var 完全指南:掌握变量声明、作用域及提升
05-【JavaScript-Day 5】告别 var 陷阱:深入理解 let 和 const 的妙用
06-【JavaScript-Day 6】从零到精通:JavaScript 原始类型 String, Number, Boolean, Null, Undefined, Symbol, BigInt 详解
07-【JavaScript-Day 7】全面解析 Number 与 String:JS 数据核心操作指南
08-【JavaScript-Day 8】告别混淆:一文彻底搞懂 JavaScript 的 Boolean、null 和 undefined
09-【JavaScript-Day 9】从基础到进阶:掌握 JavaScript 核心运算符之算术与赋值篇
10-【JavaScript-Day 10】掌握代码决策核心:详解比较、逻辑与三元运算符
11-【JavaScript-Day 11】避坑指南!深入理解JavaScript隐式和显式类型转换
12-【JavaScript-Day 12】掌握程序流程:深入解析 if…else 条件语句
13-【JavaScript-Day 13】告别冗长if-else:精通switch语句,让代码清爽高效!
14-【JavaScript-Day 14】玩转 for 循环:从基础语法到遍历数组实战
15-【JavaScript-Day 15】深入解析 while 与 do…while 循环:满足条件的重复执行
16-【JavaScript-Day 16】函数探秘:代码复用的基石——声明、表达式与调用详解
17-【JavaScript-Day 17】函数的核心出口:深入解析 return 语句的奥秘
18-【JavaScript-Day 18】揭秘变量的“隐形边界”:深入理解全局与函数作用域
19-【JavaScript-Day 19】深入理解 JavaScript 作用域:块级、词法及 Hoisting 机制
20-【JavaScript-Day 20】揭秘函数的“记忆”:深入浅出理解闭包(Closure)
21-【JavaScript-Day 21】闭包实战:从模块化到内存管理,高级技巧全解析
22-【JavaScript-Day 22】告别 function 关键字?ES6 箭头函数 (=>) 深度解析
23-【JavaScript-Day 23】告别繁琐的参数处理:玩转 ES6 默认参数与剩余参数
24-【JavaScript-Day 24】从零到一,精通 JavaScript 对象:创建、访问与操作
25-【JavaScript-Day 25】深入探索:使用 for...in 循环遍历 JavaScript 对象属性
26-【JavaScript-Day 26】零基础掌握JavaScript数组:轻松理解创建、索引、长度和多维结构
27-【JavaScript-Day 27】玩转数组:push, pop, slice, splice 等方法详解与实战
28-【JavaScript-Day 28】告别繁琐循环:forEach, map, filter 数组遍历三剑客详解
29-【JavaScript-Day 29】数组迭代进阶:掌握 reduce、find、some 等高阶遍历方法
30-【JavaScript-Day 30】ES6新特性:Set与Map,让你的数据管理更高效!
31-【JavaScript-Day 31】对象的“蓝图”详解:构造函数、new 与 instanceof 完全指南
32-【JavaScript-Day 32】深入理解 prototype、__proto__ 与原型链的奥秘
33-【JavaScript-Day 33】深入浅出 ES6 Class:从入门到精通面向对象新姿势
34-【JavaScript-Day 34】前后端数据交互的通用语:深入解析JSON
35-【JavaScript-Day 35】从 window 到 location,一文掌握浏览器对象模型 BOM
36-【JavaScript-Day 36】前端基石:深入理解 DOM 并精通五大元素选择器
37-【JavaScript-Day 37】在 DOM 树中“行走”:节点遍历
38-【JavaScript-Day 38】JS操控网页外观:从innerHTML到classList的全方位指南
39-【JavaScript-Day 39】从零到一,动态构建交互式网页的 DOM 节点操作秘籍
40-【JavaScript-Day 40】响应用户操作:事件监听与处理从入门到精通
41-【JavaScript-Day 41】JS 事件大全:click, keydown, submit, load 等常见事件详解与实战
42-【JavaScript-Day 42】深入解析事件冒泡与捕获:掌握事件委托的精髓
43-【JavaScript-Day 43】从单线程到事件循环:深入解析JS同步与异步核心机制
44-【JavaScript-Day 44】告别混乱:从回调函数到“回调地狱”的演进与解决方案
45-【JavaScript-Day 45】异步编程救星:深入解析 Promise 的状态、创建与链式调用
46-【JavaScript-Day 46】解锁 Promise 并发控制:深入解析 Promise.all、race 与 allSettled
47-【JavaScript-Day 47】告别 .then 链:用 async/await 写出诗一样的异步代码
48-【JavaScript-Day 48】告别 Ajax,拥抱现代网络请求:Fetch API 完全指南


文章目录

  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • 前言
  • 一、Fetch API 概述
    • 1.1 什么是 Fetch API?
    • 1.2 Fetch API vs. XMLHttpRequest (XHR)
    • 1.3 基本语法结构
  • 二、发起 GET 请求
    • 2.1 最简单的 GET 请求
    • 2.2 解读 Response 对象
    • 2.3 解析响应数据
    • 2.4 结合 async/await 使用
  • 三、发起 POST 请求
    • 3.1 POST 请求的核心:`options` 对象
    • 3.2 设置请求方法和头部
    • 3.3 准备请求体 `body`
    • 3.4 完整的 POST 请求示例
  • 四、Fetch 中的错误处理
    • 4.1 Fetch 的“奇怪”行为
    • 4.2 如何正确处理 HTTP 错误
  • 五、总结


前言

在上一篇文章中,我们学习了 async/await,它为我们处理异步操作提供了终极的、如同同步代码般优雅的解决方案。现在,是时候将这项强大的技能应用到 Web 开发最核心的场景之一:与服务器进行数据交换了。过去,这项任务主要由 XMLHttpRequest (XHR) 对象承担,但其设计复杂、基于事件的模式在现代 JavaScript 中显得有些格格不入。

今天,我们将隆重介绍现代 Web 的标准网络请求工具——Fetch API。它是一个基于 Promise 的强大接口,能够让我们以更简洁、更直观、更强大的方式发送网络请求和处理响应。本文将带你从零开始,全面掌握 Fetch API 的使用,无论是获取数据(GET)还是提交数据(POST),你都能轻松应对。

一、Fetch API 概述

在深入代码之前,我们首先需要理解 Fetch API 是什么,以及它相较于传统方法的优势所在。

1.1 什么是 Fetch API?

Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的部分,例如请求和响应。它还提供了一个全局的 fetch() 方法,该方法提供了一种简单、合理的方式来跨网络异步获取资源。

这个 fetch() 方法被设计为现代、通用的网络请求工具,它天生基于 Promise,这使得它能够完美地与我们之前学习的 async/await 语法结合,编写出既强大又易于阅读的异步代码。

其核心特性可以总结为:

  • 现代性:作为 XMLHttpRequest 的替代者,旨在简化网络请求。
  • Promise 驱动:fetch() 返回一个 Promise 对象,让异步处理更加链式化和直观。
  • 功能强大:提供了丰富的 Request 和 Response 对象,可以对请求和响应进行精细化控制。
  • 全局可用:fetch() 方法存在于 window 和 worker 的全局作用域中,无需引入任何库即可使用。

1.2 Fetch API vs. XMLHttpRequest (XHR)

为了更好地理解 Fetch 的优势,我们可以将其与传统的 XMLHttpRequest (XHR) 进行一个简单的对比。

特性XMLHttpRequest (XHR)Fetch API
核心机制基于事件和回调函数基于 Promise
语法相对冗长和复杂,需要实例化对象并监听事件语法简洁,一个函数调用即可发起请求
API 设计API 设计较为分散,配置和状态通过不同属性和方法管理API 设计更聚合,通过 Request 和 Response 对象进行统一管理
可读性容易陷入“回调地狱”完美结合 Promise 链式调用和 async/await,代码清晰
错误处理通过 onerror 事件处理网络层错误,HTTP 状态码需在 onreadystatechange 中判断仅在网络失败时 reject,HTTP 错误状态(如 404, 500)需在 then 中手动检查

很明显,Fetch API 在语法和设计理念上都更符合现代 JavaScript 的开发模式。

1.3 基本语法结构

fetch() 方法的语法非常简单,它接受一个必需参数(资源路径)和一个可选参数(配置对象)。

fetch(resource, options).then(response => {// 处理响应对象 (Response)}).catch(error => {// 处理网络错误});
  • resource: 你想要请求的资源 URL。这通常是一个字符串。
  • options (可选): 一个配置对象,允许你控制请求的各个方面,如请求方法 (method)、请求头 (headers)、请求体 (body) 等。如果省略,默认为 GET 请求。

这个流程图揭示了一个关键点:fetch() 是一个两步过程。首先,它返回一个代表响应的 Response 对象;然后,你需要使用 Response 对象的方法来真正地解析响应体中的数据。

二、发起 GET 请求

GET 请求是最常见的网络请求类型,用于从服务器获取数据。使用 fetch 发起 GET 请求非常直接。

2.1 最简单的 GET 请求

当不提供 options 对象或 options.method 未指定时,fetch 默认执行 GET 请求。

// 示例:从 JSONPlaceholder 获取一篇博文
fetch('https://jsonplaceholder.typicode.com/posts/1').then(response => response.json()) // 第一步:解析响应体为 JSON.then(data => console.log(data))   // 第二步:获取并使用最终数据.catch(error => console.error('请求失败:', error));

在这个例子中:

  1. 我们向指定的 URL 发送了一个 GET 请求。
  2. 第一个 .then() 接收到一个 Response 对象。我们调用它的 .json() 方法,这个方法会读取响应体并尝试将其解析为 JSON。重要的是,.json() 方法本身也返回一个 Promise。
  3. 第二个 .then() 在 .json() 的 Promise 完成后执行,接收到最终解析出的 JavaScript 对象,并将其打印到控制台。
  4. .catch() 用于捕获在整个过程中可能发生的网络错误(例如,DNS 解析失败、用户离线)。

2.2 解读 Response 对象

在调用 .json() 或 .text() 之前,我们得到的 Response 对象本身包含了大量关于响应的有用信息。

属性类型描述
okBoolean一个布尔值,表示请求是否成功。HTTP 状态码在 200-299 范围内为 true。
statusNumberHTTP 响应的状态码,例如 200 表示成功,404 表示未找到。
statusTextString状态码对应的文本信息,例如 “OK” 或 “Not Found”。
headersHeaders一个 Headers 对象,允许你查询响应头信息。
urlString请求的完整 URL。

检查 response.ok 是处理请求的良好实践,我们将在错误处理部分详细讨论。

fetch('https://jsonplaceholder.typicode.com/posts/1').then(response => {console.log('请求成功!');console.log('状态码:', response.status);       // 输出: 200console.log('状态文本:', response.statusText);   // 输出: OKconsole.log('响应是否成功:', response.ok);     // 输出: trueconsole.log('Content-Type 头:', response.headers.get('content-type')); // 输出: application/json; charset=utf-8return response.json();}).then(data => {console.log('获取到的数据:', data);});

2.3 解析响应数据

Response 对象提供了多种方法来处理不同格式的响应体,它们都返回 Promise。

  • response.json(): 解析响应体为 JSON 对象。
  • response.text(): 解析响应体为纯文本。
  • response.blob(): 解析响应体为 Blob 对象,用于处理图片、文件等二进制数据。
  • response.formData(): 解析响应体为 FormData 对象。
  • response.arrayBuffer(): 解析响应体为 ArrayBuffer 对象,用于处理通用的、固定长度的原始二进制数据。

2.4 结合 async/await 使用

使用 async/await 可以让 fetch 调用看起来更像同步代码,从而极大地提升了可读性。

// 使用 async/await 重写上面的 GET 请求
async function getPostData(postId) {try {// 等待 fetch 请求完成,获取 Response 对象const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`);// 检查响应是否成功if (!response.ok) {// 如果不成功,手动抛出错误throw new Error(`HTTP 错误! 状态: ${response.status}`);}// 等待响应体解析为 JSONconst data = await response.json();console.log(data);} catch (error) {// 捕获网络错误或我们手动抛出的错误console.error('获取数据失败:', error);}
}getPostData(1);

这段代码的功能与之前的 .then 链版本完全相同,但逻辑更清晰、更易于调试。

三、发起 POST 请求

POST 请求用于向服务器提交数据,通常用于创建新资源。这需要我们使用 fetch 的第二个参数——options 对象。

3.1 POST 请求的核心:options 对象

要发送 POST 请求,我们至少需要配置 method, headers, 和 body 这三个关键属性。

  • method: HTTP 请求方法,设置为 'POST'。
  • headers: 一个包含请求头的对象。对于发送 JSON 数据的场景,必须设置 'Content-Type': 'application/json',以告知服务器我们发送的是 JSON 格式的数据。
  • body: 请求的主体内容。注意:body 必须是一个字符串,因此我们需要使用 JSON.stringify() 将 JavaScript 对象转换为 JSON 字符串。

3.2 设置请求方法和头部

const options = {method: 'POST', // 指定请求方法为 POSTheaders: {'Content-Type': 'application/json', // 告诉服务器,我们发送的是 JSON 数据// 'Authorization': 'Bearer YOUR_TOKEN' // 如果需要认证,可以在这里添加},// ... 后面会添加 body
};

3.3 准备请求体 body

假设我们要创建一个新的博文对象,首先定义这个对象,然后使用 JSON.stringify() 将其转换。

// 1. 定义要发送的 JavaScript 对象
const newPost = {title: '一篇关于 Fetch 的新文章',body: 'Fetch API 非常强大和灵活。',userId: 1,
};// 2. 将对象转换为 JSON 字符串
const requestBody = JSON.stringify(newPost);

3.4 完整的 POST 请求示例

现在,我们将所有部分组合起来,构建一个完整的 POST 请求。

async function createPost() {const newPostData = {title: '学习 Fetch API',body: '使用 async/await 发送 POST 请求。',userId: 10,};try {const response = await fetch('https://jsonplaceholder.typicode.com/posts', {method: 'POST', // 请求方法headers: {'Content-Type': 'application/json', // 请求头},body: JSON.stringify(newPostData), // 请求体});if (!response.ok) {throw new Error(`HTTP 错误! 状态: ${response.status}`);}// 服务器通常会返回新创建的资源(带有一个 id)const createdPost = await response.json();console.log('成功创建资源:', createdPost);// 预期的输出可能像这样: { id: 101, title: '...', body: '...', userId: 10 }} catch (error) {console.error('创建帖子失败:', error);}
}createPost();

这个例子清晰地展示了如何配置并发送一个 POST 请求,并处理服务器的响应。

四、Fetch 中的错误处理

错误处理是健壮应用程序的关键部分,而 fetch 的错误处理机制有一个非常重要的特点需要我们特别注意。

4.1 Fetch 的“奇怪”行为

一个常见的误区是:认为所有非 2xx 的 HTTP 状态(如 404 Not Found, 500 Internal Server Error)都会导致 fetch 的 Promise被 reject。

事实并非如此。

fetch() 返回的 Promise 仅在遇到网络级别故障时(例如,无法连接服务器、CORS 策略阻止了请求等)才会被 reject。对于服务器返回的任何 HTTP 状态码(包括 4xx 和 5xx),fetch 的 Promise 都会被 fulfill(即成功解决),并返回一个 Response 对象。

这意味着,以下代码 无法 捕获到 404 错误:

// 错误示范:这样无法捕获到 404 错误
fetch('https://jsonplaceholder.typicode.com/posts/non-existent-url').then(response => response.json()) // 即使是 404,这里也会执行.then(data => console.log(data))   // 这里可能会因为 response.json() 失败而报错.catch(error => {// 这个 catch 块不会因为 404 而被触发console.error('这个 catch 不会捕获到 404 错误', error);});

4.2 如何正确处理 HTTP 错误

正确的做法是利用我们之前介绍的 response.ok 属性。这个属性为我们提供了一个简单的方式来判断 HTTP 状态码是否在成功范围内(200-299)。

正确的错误处理模式如下:

  1. 发起 fetch 请求。
  2. 在第一个 .then() 或 await 之后,检查 response.ok 的值。
  3. 如果 response.ok 是 false,则手动创建一个 Error 对象并 throw 它。
  4. 这样,这个被抛出的错误就可以被后续的 .catch() 块或 try...catch 语句捕获。
// 正确的错误处理模式
async function getPostDataSafely(postId) {try {const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`);// 关键步骤:检查响应是否成功if (!response.ok) {// 如果不成功,构建一个包含状态码和文本的错误信息const errorText = await response.text(); // 尝试获取错误响应体throw new Error(`请求失败,状态码: ${response.status}. 响应: ${errorText}`);}const data = await response.json();console.log('获取数据成功:', data);} catch (error) {// 现在可以捕获所有类型的错误:网络错误和我们手动抛出的 HTTP 错误console.error('操作失败:', error.message);}
}// 测试一个存在的资源
getPostDataSafely(1);// 测试一个不存在的资源
getPostDataSafely(9999); // 将会触发 catch 块

通过这种模式,我们就能统一处理网络错误和应用层(HTTP)错误,让我们的代码更加健壮和可预测。

五、总结

Fetch API 是现代 JavaScript 中进行网络通信的基石。通过本文的学习,我们掌握了其核心用法和关键概念,现在让我们来回顾一下重点:

  1. 核心理念:Fetch API 是一个基于 Promise 的现代网络请求接口,通过全局 fetch() 函数使用,它比传统的 XMLHttpRequest 更简洁、更强大。
  2. 两步处理:fetch() 的调用是一个两阶段的过程。第一阶段是获取 Response 对象,它包含了响应的元数据(如状态码、头部)。第二阶段是调用 Response 对象的方法(如 .json(), .text())来异步解析响应体,获取真实数据。
  3. 请求配置:对于 GET 以外的请求(如 POST),我们需要使用 fetch() 的第二个参数 options 对象来详细配置请求,包括 method、headers 和 body。特别注意 body 必须是字符串,通常使用 JSON.stringify() 进行转换。
  4. 关键的错误处理:fetch 的 Promise 只在网络失败时 reject。对于服务器返回的 HTTP 错误状态(如 404, 500),Promise 依然会 fulfill。因此,必须在代码中显式检查 response.ok 属性,并手动抛出错误,才能被 .catch() 或 try...catch 统一捕获。
  5. 最佳实践:结合 async/await 使用 fetch 可以让异步网络请求代码的结构变得扁平、清晰,是当前处理网络请求的最佳实践。

掌握了 Fetch API,你就掌握了与世界各地服务器对话的能力。在接下来的文章中,我们将学习如何组织我们的代码,使其更具可维护性和可重用性——欢迎来到模块化的世界!


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

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

相关文章

BUUCTF在线评测-练习场-WebCTF习题[极客大挑战 2019]Knife1-flag获取、解析

解题思路 这题没有什么解题思路,打开靶场,标题是白给的shell 页面显示了 eval($_POST["Syc"]); 这是php webshell命令,密码为Syc,可直接通过该命令连接,根据标题提示,直接尝试用蚁剑连接 连接成…

Qt—(Qt线程,Qt进程,,QT与sqlite数据库)

一 Qt线程与进程概述 线程与进程对比 特性线程 (QThread)进程 (QProcess)内存空间共享父进程内存独立内存空间创建开销小 (几MB)大 (几十MB)通信方式共享内存/信号槽管道/套接字/文件崩溃影响导致整个进程终止仅自身终止适用场景高并发任务、计算密集型隔离第三方应用、安全需求…

计算机视觉阶段一:CV入门基础

目录 学习目标: 一、核心知识点 二、实用工具推荐 三、学习内容与步骤 1.环境搭建 2.图像获取与显示 3 图像基础处理 4 图像几何变换 5 图像像素操作 四、实战任务建议 实战 1:图像加载 显示 保存 实战 2:灰度图 边缘检测 图…

新增MCP接入和AutoAgent,汉得灵猿AI中台1.6版正式发布!

汉得灵猿(大圣)AI中台1.6版本,经过数月迭代,现已正式发布! 新版本最被期待的新功能,无疑是4月份预告的MCP接入,而令人同样激动的另一项新功能,则是AutoAgent动态规划智能体。除了两…

总结汇报思路

一、明确汇报目标 受众需求:领导/客户/团队最关心什么?(结果?问题?下一步计划?) 核心目的:展示成果?争取资源?总结经验?解决问题? 时…

文件锁的艺术:深入解析 `fcntl(F_SETLK/F_GETLK)`

引言:在共享资源时代守护数据一致性 在多进程/多线程的应用场景中,文件作为一种共享资源常常面临被并发访问的挑战。想象一个数据库系统,多个客户端可能同时尝试修改同一数据文件;或者一个配置文件,需要确保在更新时不…

一个免费的视频、音频、文本、图片多媒体处理工具

大家好,我是小悟。 给大家推荐一款可以免费使用的视频、音频、文本、图片处理工具,名字叫百创工坊,不用下载,不用注册,有免费的用就赶紧薅吧。 视频工具 提取音频:从视频中提取音频文件,支持多…

在 ef core 中操作复杂类型的序列化和反序列化时,如何全局设置 utf-8 编码避免中文字符被转义?

我们在使用 Entity Framework Core(EF Core) 时,如果希望 全局设置 JSON 序列化和反序列化使用 UTF-8 编码,通常需要配置 System.Text.Json 的默认行为,因为 EF Core 6.0 及以上版本默认使用 System.Text.Json 进行 JS…

WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)

WPF CommunityToolkit.Mvvm 中的 ObservableRecipient 是什么? ObservableRecipient 是 .NET Community Toolkit MVVM 库中的一个核心类,继承自 ObservableObject。它专为 WPF 应用设计,提供以下核心功能: 基础数据绑定支持&am…

《C++》命名空间简述

文章目录 一、命名空间定义二、访问命名空间内的成员三、标准命名空间:std四、嵌套命名空间 一、命名空间定义 在C中,命名空间(namespace)是一种将标识符分组的机制,用于避免重命名。例如: int a 3;int main() {int a 0;print…

【路径规划】基于Matlab的改进RRT算法二维/三维路径规划

基于Matlab的改进RRT算法二维/三维路径规划 一、引言 在机器人学、自动驾驶等领域,路径规划是一个关键问题,它旨在为机器人或车辆找到一条从起始点到目标点的安全、高效的路径。RRT(Rapidly-exploring Random Trees)算法作为一种…

PHP的命名空间与自动加载机制

在PHP 5.3版本之后,引入了命名空间的概念,这为解决全局命名冲突和促进代码的模块化提供了强有力的工具。命名空间允许开发者将类、函数和常量封装在不同的命名空间中,从而避免了全局范围内的名称冲突问题。 命名空间基础 命名空间在PHP中是…

OpenSIPS 邂逅 Kafka:构建高效 VoIP 消息处理架构

使用场景使用步骤 引入模块组装&发送数据消费数据故障转移 使用场景 异步日志处理:将 OpenSIPS 中的 SIP 信令日志、通话记录(CDR)等数据发送到 Kafka 队列中。 事件通知与监控:利用 OpenSIPS 的 event_interface 模块将 S…

《AI大模型应用技术开发工程师》学习总结

以下是对你提供的《AI大模型应用技术开发工程师》课程内容的系统梳理,已去除所有广告、价格、报名、个人信息等内容,并补全了技术要点,最后给出客观的学习建议和个人感想,适合公开分享或自我学习参考。 AI大模型应用技术开发工程师…

Python爬虫实战:研究LOSO相关技术

1. 引言 1.1 研究背景与意义 随着互联网数据的爆炸式增长,个性化推荐系统成为提升用户体验的关键技术。准确捕捉用户兴趣需要大量多维度数据,但获取高质量标注数据面临隐私保护、数据分散等挑战。网络爬虫技术为自动采集用户行为数据提供了解决方案,而如何有效评估模型在个…

stm32万年历仿真+keil5程序

stm32万年历 本设计是利用单片机实现一个简易万年历系统,能够准确显示时、分、秒信息。用户可通过特定按键对时间进行设置调整,具备基本的时间校准功能,可满足日常简易计时需求。运用了stm32单片机模块内部定时器 / 计数器功能来实现精确计时…

操作系统--名称解释

第一章: 操作系统:位于硬件层之上,所有软件层之下的一个系统软件,是管理系统中各种软硬件资源,方便用户使用计算机系统的程序集合 并发:宏观上是同时发生,但是再微观是交替发生的(若干事件在同一时间间隔内发生,单CPU) 并行:微观上同时发生(要求多个CPU) 共享:系统的资源可以…

2025.6.16-实习

2025.6.18--2025.6.23 1.使用Cocos,从0开发老虎棒子鸡2D游戏。实现:AI自动选择,倒计时,对战逻辑,播放动画,设置背景音乐等功能。 2.使用Cocos,开发2D手术游戏。实现:视频、音频控制播…

构建你的 AI 模块宇宙:Spring AI MCP Server 深度定制指南

引言:当模块化遇见 AI 在微服务架构的海洋中,MCP(Module Communication Protocol)就像一艘智能帆船,它让不同 AI 模块的通信变得优雅而高效。本文将带你构建一艘属于自己的 AI 智能帆船——自定义 Spring AI MCP Serv…

从数据到洞察:UI前端如何利用大数据优化用户体验

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在当今数字化时代,数据如同蕴藏着无限价值的宝藏,源源不断地产生并积累…