JavaScript 发起网络请求 axios、fetch、async / await
目录
fetch
发送 GET 请求(fetch)
发送 POST 请求(fetch)
处理后台异常响应
async / await
async
await
发送 GET 请求(async / await fetch)
发送 POST 请求(async / await fetch)
Axios
发送 GET 请求(axios)
发送 POST 请求(axios)
发送 GET 请求(async / await axios)
发送 POST 请求(async / await axios)
请求拦截器
响应拦截器
取消请求
中止请求
fetch
fetch 是现代浏览器中用于发起网络请求的 API,它提供了一种更加简洁和强大的方式来获取资源(例如从网络加载数据)。与传统的 XMLHttpRequest 相比,fetch 提供了更简洁的语法和更强的功能,并且返回的是 Promise,使得异步编程更加易于理解和处理。
fetch 允许我们通过 HTTP 请求(如 GET、POST、PUT、DELETE 等方法)向服务器请求数据,并异步地处理请求结果。它是异步的,意味着不会阻塞其他 JavaScript 代码的执行。
语法:
fetch(url, options)
.then(response => response.json()) // 将响应体解析为 JSON
.then(data => console.log(data)) // 处理返回的数据
.catch(error => console.error('Error:', error)); // 错误处理
参数说明:
- url: 请求的目标 URL(可以是相对路径或绝对路径)。
- options: 可选的配置对象,包含请求方法、头信息、请求体等。
options 常用选项:
method:请求方式,默认为 GET。常见值有 POST、PUT、DELETE、PATCH 等。
示例:
fetch('https://example.com', {method: 'POST', });
headers:请求头,通常是一个对象,包含键值对。
示例:
fetch('https://example.com', {headers: {'Content-Type': 'application/json','Authorization': 'Bearer token',} });
body:请求体,仅在方法是 POST、PUT 等时使用,通常是 JSON 格式的数据。
示例:
fetch('https://example.com', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ name: 'John', age: 30 }) });
mode:控制请求的跨域行为,常用的值有 no-cors、cors 和 same-origin。默认为 cors。
- no-cors:不携带跨域凭证,限制请求返回内容的访问。
- cors:允许跨域请求,需目标服务器支持 CORS。
- same-origin:仅允许同源请求(即相同的协议、域名和端口)。
示例:
fetch('https://example.com', {mode: 'no-cors', // 不发送跨域请求 });
cache:控制缓存行为,常用值有 default、no-store、reload 等。
- default:按常规缓存机制处理,有缓存就用缓存,没有缓存就从网络加载。
- no-store:不缓存,始终从网络加载。
- reload:强制重新加载,不使用缓存(一点缓存不能用,确保从网络加载最新数据)。
- no-cache:查找缓存并验证(缓存可用返回304 状态码),缓存不可用重新从网络加载。
- force-cache:强制使用缓存,如果没有则从网络加载。
- only-if-cached:只使用缓存,缓存没有则不请求。
示例:
fetch('https://example.com', {cache: 'no-cache', // 禁用缓存 });
credentials:控制是否发送 cookies、http认证信息等,常见值有 same-origin 和 include。
- same-origin:仅在同源请求时自动携带凭证(默认)。
- include:无论同源还是跨域请求,都携带凭证。
- omit:请求不携带凭证,适用于公开资源或不需要身份验证的请求。
示例:
fetch('https://example.com', {credentials: 'include' });
发送 GET 请求(fetch)
示例:
fetch('http://127.0.0.1:8080/test?name=123').then(response => response.json()) // 解析 JSON 响应,// 这个 response.json() 不是返回的数据,还要调用 response.json() 函数,等待处理完成返回给下一个 then 才是处理好的数据.then(data => {console.log(data); // 输出后台返回的数据}).catch(error => console.error('Error:', error)); // 错误处理
发送 POST 请求(fetch)
示例: 请求头:Content-Type: application/x-www-form-urlencoded
const data = {name: 'Tom'
};
// 将对象转换为 x-www-form-urlencoded 格式
const urlEncodedData = new URLSearchParams(data).toString();fetch('http://127.0.0.1:8080/test', {method: 'POST',headers: {'Content-Type': 'application/x-www-form-urlencoded',},body: urlEncodedData,
}).then(response => response.json()) // 解析 JSON 响应 // 这个 response.json() 不是返回的数据,还要调用 response.json() 函数,等待处理完成返回给下一个 then 才是处理好的数据.then(data => {console.log(data); // 输出后台返回的数据}).catch(error => console.error('Error:', error)); // 错误处理
示例: 请求头:Content-Type: application/json
fetch('http://127.0.0.1:8080/test', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({name: 'Tom'}),
}).then(response => response.json()) // 解析 JSON 响应 // 这个 response.json() 不是返回的数据,还要调用 response.json() 函数,等待处理完成返回给下一个 then 才是处理好的数据.then(data => {console.log(data); // 输出后台返回的数据}).catch(error => console.error('Error:', error)); // 错误处理
处理后台异常响应
fetch 只会在网络失败或请求被阻止时拒绝 Promise。对于 4xx 或 5xx 错误(如 404 或 500),它依然会返回一个 fulfilled (已完成)状态的 Promise,所以需要手动检查 response.ok 来判断请求是否成功。
示例:
fetch('http://127.0.0.1:8080/test?name=123').then(response => {// 处理后台程序异常的返回,例如 500if (!response.ok) {throw new Error('Network response was not ok');}return response.json();}).then(data => {console.log(data); }).catch(error => console.error('Error:', error));
async / await
async / await 是 JavaScript 中用来处理异步操作的一种语法糖,它基于 Promise,使得处理异步代码变得更加简洁和易读。async/await 主要是为了替代 .then() 的链式调用,目的是让异步代码更加简洁和可读。虽然 fetch 本身是异步的,使用 async/await 使得你可以像写同步代码一样处理异步操作,从而避免了嵌套 .then() 造成的“回调地狱”(callback hell)问题。
async
async 是一个用于声明异步函数的关键字。它告诉 JavaScript 引擎,这个函数是异步的,返回的结果会是一个 Promise 对象。
当你声明一个 async 函数时,无论函数内部是否有 return,它都会自动返回一个 Promise。如果你在函数内部返回一个值,Promise 会自动将该值包装起来。
语法:
async function foo() {// 异步操作
}
console.log(foo()); // 打印 Promise { undefined },表示是一个Promise对象
示例:
// 定义一个 async 函数
async function foo() {return "Hello World";
}// 调用 async 函数,调用 then 函数处理 async 返回结果。
foo().then((result) => {console.log(result);
});
await
await 用于等待一个 Promise 对象的结果,它只能在 async 函数内部使用。当遇到 await 时,JavaScript 会暂停 async 函数的执行,等待 Promise 被解析(resolved)或拒绝(rejected)后再继续执行。
没有 await 时: async 函数返回一个 Promise,你需要使用 .then() 或 .catch() 来处理这个 Promise 的结果。
有 await 时: await 会暂停 async 函数的执行,直到 async 函数的返回结果 Promise 被解析,并返回解析的结果给 await。你可以直接在 async 函数内部处理异步结果,而不需要在 async 函数外部使用 .then() 来处理结果了。
示例对比: // 没用 await 时
async function foo() {return "Hello, World!";
}// 没有 await 时,这样处理 async 的返回结果
foo().then(result => {console.log(result); // 输出: "Hello, World!"
});
示例对比: // 使用 await 时
async function foo() {// 有 await 时,直接在这里等待 async 函数的返回结果,然后在 async 函数内部就把返回结果处理了。const result = await "Hello, World!";console.log(result); // 输出: "Hello, World!"
}foo();
发送 GET 请求(async / await fetch)
示例:
// 创建一个 async 函数
async function get() {// 使用 await fetch 发送 GET 请求const response = await fetch('http://127.0.0.1:8080/test?name=123');// 判断请求后台是否异常if (!response.ok) {throw new Error('请求失败,状态码:' + response.status);}const data = await response.json(); // 解析 JSON 响应体,这一步相当于 .then(response => response.json())console.log(data); // 输出后台返回的数据
}// 调用 async 函数
get().catch(error => console.error('Error:', error));
发送 POST 请求(async / await fetch)
示例: 请求头:Content-Type: application/x-www-form-urlencoded
// 创建一个 async 函数
async function post() {// 请求体的数据,使用 URLSearchParams 对象,创建 x-www-form-urlencoded 数据格式的对象const formData = new URLSearchParams();formData.append('name', 'Tom'); // 请求参数// 使用 await fetch 发送 POST 请求const response = await fetch('http://127.0.0.1:8080/test', {method: 'POST', // 设置请求方法为 POSTheaders: {'Content-Type': 'application/x-www-form-urlencoded', // 设置请求头},body: formData, // 发送表单数据});// 判断请求后台是否异常if (!response.ok) {throw new Error('请求失败,状态码:' + response.status);}const data = await response.json(); // 解析 JSON 响应体,这一步相当于 .then(response => response.json())console.log(data); // 输出后台返回的数据
}// 调用 async 函数
post().catch(error => console.error('Error:', error));
示例: 请求头:Content-Type: application/json
// 创建一个 async 函数
async function post() {// 请求参数:一个 JSON 对象const requestBody = {name: 'Tom'};try {// 使用 await fetch 发送 POST 请求const response = await fetch('http://127.0.0.1:8080/test', {method: 'POST', // 设置请求方法为 POSTheaders: {'Content-Type': 'application/json', // 设置请求头},body: JSON.stringify(requestBody), // 发送json数据});// 判断请求后台是否异常if (!response.ok) {throw new Error('请求失败,状态码:' + response.status);}const data = await response.json(); // 解析 JSON 响应体,这一步相当于 .then(response => response.json())console.log(data); // 输出后台返回的数据} catch (error) {console.error('Error:', error)}
}// 调用 async 函数
post();
Axios
Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境中发送 HTTP 请求。它支持发送 GET、POST、PUT、DELETE 等常见的 HTTP 请求,并能够处理响应数据。
安装 Axios,这里以 Node.js 环境为例
npm install axios
Axios 的常用方法:
- axios.get(url [, config]):发送一个 GET 请求。url 是请求的目标 URL,config 是可选的配置对象。
- axios.post(url [, data [, config]]):发送一个 POST 请求。url 是目标 URL,data 是请求体数据,config 是可选的配置对象。
- axios.put(url [, data [, config]]):发送一个 PUT 请求。url 是目标 URL,data 是请求体数据,config 是可选的配置对象。
- axios.delete(url [, config]):发送一个 DELETE 请求。url 是目标 URL,config 是可选的配置对象。
- axios.head(url [, config]):发送一个 HEAD 请求,通常用于获取响应头信息。url 是目标 URL,config 是可选的配置对象。
- axios.options(url [, config]):发送一个 OPTIONS 请求,通常用于获取服务器支持的 HTTP 方法。url 是目标 URL,config 是可选的配置对象。
- axios.patch(url [, data [, config]]):发送一个 PATCH 请求,用于对资源进行部分更新。url 是目标 URL,data 是请求体数据,config 是可选的配置对象。
- axios.all(iterable):并行发送多个请求,iterable 是一个数组,包含多个 Promise 对象。axios.all() 方法返回一个新的 Promise,在所有请求完成后,才会执行 then 方法。
- axios.spread(callback):用于 axios.all() 方法返回的多个响应结果展开。它将多个参数分配给传入的回调函数。
- axios.create([config]):创建一个新的 Axios 实例,可以在实例上设置默认配置,以便复用。
- axios.CancelToken.source():创建一个取消令牌源,用于取消请求。
- axios.isCancel(value):检查给定的值是否是由 CancelToken 取消的。
config 常用选项:
headers:设置请求头。用于设置请求发送时携带的头部信息。
示例:
import axios from 'axios';axios.get('https://api.example.com/data', {headers: {'Content-Type': 'application/json','Authorization': 'Bearer token_value'} });
params:URL 查询参数,适用于 GET 请求。它会自动被序列化为查询字符串,并追加到 URL 后面。
示例:
import axios from 'axios';axios.get('https://api.example.com/data', {params: {userId: 1,page: 2} }); // 生成的请求 URL 会是 https://api.example.com/data?userId=1&page=2
timeout:请求的超时时间,单位是毫秒。如果请求超过这个时间没有响应,Axios 会中止请求。
示例:
import axios from 'axios';axios.get('https://api.example.com/data', {timeout: 5000 // 设置超时为5秒 });
auth:设置 HTTP 基本认证凭证,包括 username 和 password。
示例:
import axios from 'axios';axios.get('https://api.example.com/data', {auth: {username: 'admin',password: '123456'} });
responseType:设置响应的数据类型,常见的值有 json、text、blob、arraybuffer 等。默认是 json。
- json:响应的数据将会被解析为 JSON 格式,适用于返回 JSON 数据的接口。
- text:响应的数据将会被处理为纯文本(string),适用于返回文本数据的接口,如 HTML、纯文本内容等。
- blob:响应的数据会作为 Blob 对象(即二进制大对象)返回,适用于文件下载、图片等二进制数据。
- arraybuffer:响应的数据会作为 ArrayBuffer 对象返回,通常用于二进制数据流,如音频、视频或其他二进制文件。
- document:响应的数据将作为 document 对象返回。通常适用于返回 HTML 文档的接口。
- stream:用于 Node.js 中的请求。stream 使得响应的数据可以作为一个流(stream)处理,通常用于处理大量数据的下载。
示例:
import axios from 'axios';axios.get('https://api.example.com/data', {responseType: 'blob' });
cancelToken:用于取消请求,提供一个取消令牌,用于在需要时中止请求。
示例:
import axios from 'axios';const cancelTokenSource = axios.CancelToken.source(); axios.get('https://api.example.com/data', {cancelToken: cancelTokenSource.token }); cancelTokenSource.cancel('请求被用户取消');
withCredentials:是否携带跨域请求时的凭证(如 Cookies)。默认为 false,如果请求跨域且需要凭证,可以设置为 true。
示例:
import axios from 'axios';axios.get('https://api.example.com/data', {withCredentials: true });
maxRedirects:最大重定向次数,默认情况下 Axios 会自动跟随重定向,设置该参数可以限制最大重定向次数。
示例:
import axios from 'axios';axios.get('https://api.example.com/redirect', {maxRedirects: 5 });
paramsSerializer:一个函数,用于自定义 URL 查询参数的序列化方式。可以用来定制如何将对象转化为查询字符串。
示例:
import axios from 'axios';axios.get('https://api.example.com/data', {params: {userId: 1,page: 2},paramsSerializer: function (params) {// 使用 URLSearchParams 序列化const searchParams = new URLSearchParams(params);return searchParams.toString();} });
发送 GET 请求(axios)
示例:
import axios from 'axios';
// 参数在url后面
axios.get('http://127.0.0.1:8080/test?name=123').then(response => {console.log(response.data); // 输出后台返回的数据}).catch(error => {console.error(error); // 捕获并处理请求中的错误(也可以捕获后台的错误)});
import axios from 'axios';
// 参数语法上使用params,实际上还是跟在url后面
axios.get('http://127.0.0.1:8080/test', {params: {name: 123}
}).then(response => {console.log(response.data); // 输出后台返回的数据}).catch(error => {console.error(error); // 捕获并处理请求中的错误(也可以捕获后台的错误)});
发送 POST 请求(axios)
示例: 请求头:Content-Type: application/x-www-form-urlencoded
import axios from 'axios';// 创建 x-www-form-urlencoded 数据格式的对象
const formData = new URLSearchParams();
formData.append('name', 'Tom'); // 请求参数axios.post('http://127.0.0.1:8080/test', formData, {headers: {'Content-Type': 'application/x-www-form-urlencoded' // 不用显式的设置,axios会根据参数的数据类型来选择合适的 Content-Type}
}).then(response => {console.log(response.data); // 输出后台返回的数据}).catch(error => {console.error(error); // 捕获前后台的错误});
示例: 请求头:Content-Type: application/json
import axios from 'axios';// 创建 json 对象
const data = {name: 'Tom'
};axios.post('http://127.0.0.1:8080/test', data, {headers: {'Content-Type': 'application/json' // 不用显式的设置,axios会根据参数的数据类型来选择合适的 Content-Type}
}).then(response => {console.log(response.data); // 输出后台返回的数据}).catch(error => {console.error(error); // 捕获前后台的错误});
发送 GET 请求(async / await axios)
import axios from 'axios';// 定义一个异步函数,使用 async/await 语法
async function get() {try {// 使用 await 等待 axios.get 请求返回const response = await axios.get('http://127.0.0.1:8080/test', { params: { 'name': 123 } });console.log(response.data); // 输出后台返回的数据} catch (error) {console.error(error); // 捕获前后台的错误}
}// 调用异步函数
get();
发送 POST 请求(async / await axios)
示例: 请求头:Content-Type: application/x-www-form-urlencoded
import axios from 'axios';// 定义一个异步函数,使用 async/await 语法
async function post() {try {// 使用 await 等待 axios.post 请求返回const response = await axios.post('http://127.0.0.1:8080/test', new URLSearchParams({ 'name': 'Tom' }) // 创建 x-www-form-urlencoded 数据格式的对象);console.log(response.data); // 输出后台返回的数据} catch (error) {console.error(error); // 捕获前端和后端的错误}
}// 调用异步函数
post();
示例: 请求头:Content-Type: application/json
import axios from 'axios';// 定义一个异步函数,使用 async/await 语法
async function post() {try {// 使用 await 等待 axios.post 请求返回const response = await axios.post('http://127.0.0.1:8080/test', { 'name': 'Tom' });console.log(response.data); // 输出后台返回的数据} catch (error) {console.error(error); // 捕获前端和后端的错误}
}// 调用异步函数
post();
请求拦截器
请求拦截器(Request Interceptor)允许你在请求被发送到服务器之前,对请求进行修改或添加额外的配置。比如添加认证令牌(token)、设置请求头、统一处理请求参数等。
示例:
import axios from 'axios';// 请求拦截器
axios.interceptors.request.use((config) => {// 在请求发送前做些什么// console.log('Request Interceptor:', config);config.headers['Authorization'] = `Bearer token`; // 在请求头中添加 tokenreturn config; // 必须返回 config,否则请求不会继续},(error) => {// 对请求错误做些什么console.error('Request Error:', error);return Promise.reject(error); // 如果发生错误,继续返回 Promise 错误}
);async function post() {try {const response = await axios.post('http://127.0.0.1:8080/test', { 'name': 'Tom' });console.log(response.data); // 输出后台返回的数据} catch (error) {console.error(error); // 捕获前端和后端的错误}
}// 调用异步函数
post();
响应拦截器
响应拦截器(Response Interceptor)是在收到响应之后、响应数据被 then() 或 catch() 处理之前,对响应数据进行处理的一个功能。响应拦截器允许你在响应结果返回到应用之前,统一处理或修改响应的数据或统一异常错误处理。
示例:
import axios from 'axios';// 响应拦截器
axios.interceptors.response.use((response) => {// console.log('Response Interceptor:', response); // 在响应数据到达应用之前做些什么// TODO 你可以在这里统一处理数据,例如提取其中需要的部分console.log("aaaaa", response.data);return response.data; // 只返回响应的主体部分,去掉多余的信息},(error) => {// 对响应错误做些什么console.error('Response Error:', error);// 例如,如果是 401 错误,可以跳转到登录页面if (error.response && error.response.status === 401) {window.location.href = '/login';}return Promise.reject(error); // 错误处理后,返回拒绝的 Promise}
);async function post() {try {const data = await axios.post('http://127.0.0.1:8080/test', { 'name': 'Tom' });console.log(data); // 输出后台返回的数据} catch (error) {console.error(error); // 捕获前端和后端的错误}
}// 调用异步函数
post();
取消请求
用户可以在页面长时间未返回响应时,点击按钮主动取消请求。前台取消请求后,后台接口仍然还在继续执行(想要后台接口也取消执行,那你需要自定义代码实现,例如再写个取消请求的接口用于前端点击取消是给让前端调用。根据自己的实际情况判断是否需要该需求),只是后续的响应前台不会再处理。axios 也会抛出一个取消的异常供程序员捕获。
示例:
import axios from 'axios';// 创建一个取消令牌
const CancelToken = axios.CancelToken;
let cancel: (msg?: string) => void; // 用于存储取消函数的变量async function post() {try {const response = await axios.post('http://127.0.0.1:8080/test', { 'name': 'Tom' } // 请求参数, {cancelToken: new CancelToken(function executor(c) {cancel = c; // 保存取消函数})});console.log(response.data); // 输出后台返回的数据} catch (error) {if (axios.isCancel(error)) {console.log('请求被取消:', error.message); // 如果请求被取消,会进入这个条件} else {console.error('请求发生错误:', error); // 其他类型的错误}}
}// 调用异步函数
post();// 假设在某个地方你需要取消请求,这里使用定时器模拟。实际中应该是一个长时间没有返回响应后的一个取消按钮
setTimeout(() => {cancel('请求被手动取消'); // 手动取消请求并传递取消的消息
}, 1000); // 1秒后取消请求
中止请求
设置超时时间,当请求超出这个时间限制后,会自动终止请求,并抛出一个超时异常。当然,后台接口依然还是在继续运行。
示例:
import axios from 'axios';async function post() {try {const response = await axios.post('http://127.0.0.1:8080/test', { 'name': 'Tom' }, {timeout: 5000 // 设置超时时间为 5 秒});console.log(response.data);} catch (error: any) {// 捕获请求超时错误if (error.code === 'ECONNABORTED') {console.log('请求超时');} else {console.error(error);}}
}// 调用异步函数
post();
相关文章:
JavaScript 发起网络请求 axios、fetch、async / await
目录 fetch 发送 GET 请求(fetch) 发送 POST 请求(fetch) 处理后台异常响应 async / await async await 发送 GET 请求(async / await fetch) 发送 POST 请求(async / await fetch&…...
安装OpenJDK21(linux、macos)
文章目录 安装OpenJDK21java21linux下安装配置mac下安装 安装OpenJDK21 java21 封神!Java 21正式发布了,迎来了史诗级新特性,堪称版本最强!!! 视频链接:https://www.bilibili.com/video/BV1E8…...
Java面试宝典:说下Spring Bean的生命周期?
Java面试宝典专栏范围:JAVA基础,面向对象编程(OOP),异常处理,集合框架,Java I/O,多线程编程,设计模式,网络编程,框架和工具等全方位面试题详解 每…...
k8s向容器内传文件与下载文件
1、下载: kubectl cp <namespace>/<pod-name>:<container-path> <local-path>示例: kubectl cp mynamespace/mypod:/tmp/testfile.txt ./testfile.txt如果 Pod 中有多个容器,可以通过 -c 标志指定容器: kubectl c…...
A4988一款带转换器和过流保护的 DMOS 微步驱动器的使用方式
A4988是一款带转换器和过流保护的 DMOS 微步驱动器,用于驱动双极步进电动机。它支持全、半、1/4、1/8 及 1/16 步进模式,输出驱动性能可达 35 V 及 2 A。其特点包括简单的步进和方向控制接口、可调电位器调节最大电流输出、自动电流衰减模式检测/选择以及…...
Elasticsearch+Logstash+Kibana可视化集群部署
文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch:开源实时分布式搜索和分析引擎,支持大规模数据存储和高吞吐量,提供丰富的搜索功能和可扩展性。 Logsta…...
数据结构之二叉树
数据结构之二叉树 数据结构之二叉树1. 什么是二叉树?2. 基本概念3. 二叉树的基本形态4. 二叉树的性质5. 特殊二叉树6. 二叉树的存储7. 二叉树的遍历7.1 前序遍历7.2 中序遍历7.3 后序遍历7.4 层次遍历 8. 应用场景9. 实例代码9.1 示例树结构9.2 输出结果 数据结构之…...
华为云+硅基流动使用Chatbox接入DeepSeek-R1满血版671B
华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 硅基流动 1.1 注册登录 1.2 实名认证 1.3 创建API密钥 1.4 客户端工具 OllamaChatboxCherry StudioAnythingLLM 资源包下载: AI聊天本地客户端 接入Chatbox客户端 点击设置 选择SiliconFloW API 粘贴1.3创…...
《图解设计模式》笔记(十)用类来表现
二十二、Command模式:命令也是类 一个类调用某方法,虽然调用结果会反映在对象的状态中,但不会留下工作的历史记录。 若有一个类表示“请进行这项工作”的“命令”,每一项想做的工作就不再是“方法的调用”这种动态处理了,而是一个表示命令的类的实例,即可以用“物”来表…...
Scrapy:任务队列底层设计详解
Scrapy 中队列设计详解 1. 概述 Scrapy 的队列系统是其调度器(Scheduler)的核心组件之一,负责存储和管理待抓取的请求。Scrapy 实现了两种类型的队列: 内存队列:请求存储在内存中,重启后数据丢失磁盘队列…...
zola + github page,用 workflows 部署
之前的Zola都是本地build之后,再push到github上,这种方式很明显的弊端就是只能在本地编辑,而不能通过github编辑,再pull到本地,缺乏了灵活性。因此将zola用workflows来部署。 repo地址:https://github.com/…...
pytest测试专题 - 1.2 如何获得美观的测试报告
<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细,用例在执行调试时还算比较方便阅读和提取失败信息, 但对于大量测试用例运行时,可能会存在以下不足 报文被冲掉测试日志没法归档 …...
关闭浏览器安全dns解决访问速度慢的问题
谷歌浏览器加载速度突然变慢了?检查安全DNS功能(DoH)是否被默认开启。 谷歌浏览器在去年已经推出安全DNS功能(即DoH) , 启用此功能后可以通过加密的DNS增强网络连接安全性。例如查询请求被加密后网络运营商将无法嗅探用户访问的地址,因此对于增强用户的…...
今日AI和商界事件(2025-02-14)
今日AI大事件主要包括以下几个方面: 一、苹果新品预告 事件概述:苹果CEO蒂姆库克在社交媒体发布7秒视频,配文“准备好迎接家庭的新成员”,并宣布2月19日将有新品发布。知名科技记者马克古尔曼称,新款低端iPhone SE将…...
【黑马点评优化】1-使用JWT登录认证+redis实现自动续期
1-使用JWT登录认证redis实现自动续期 0 前言1 原先的redis实现登录鉴权2 JWT登录认证Redis自动续期2.1 认证(identification)授权 (authorization)和鉴权(Authorization)2.1.1 认证(identificat…...
一个让Stable Diffusion更稳定、更易用的Github开源项目
2023除了ChatGPT大火,Stable Diffusion同样也是非常火热,Stable Diffusion是一个Github开源项目,很多爱好者都会本地安装,但面对一些初学者来说,在安装、配置和使用过程中还是会经常出现很多问题,特别不了解…...
Mac之JDK安装
Mac之JDK安装 一.安装 jdk 打开终端输入命令:java -version 查看是否已安装 JDK Oracle 官方下载地址 根据自己Mac 系统安装 查看 Mac 系统,打开中断命令,输入: uname -a Compressed Archive 是压缩文档,下载的是一个 .tar.gz 压缩包 D…...
深入Flask:如何优雅地处理HTTP请求与响应
哈喽,大家好,我是木头左! 本文将带你深入了解如何在Flask中优雅地处理HTTP请求和响应,让你的应用更加高效、安全和用户友好。 创建一个简单的Flask应用 让从创建一个最简单的Flask应用开始: from flask import Flaskapp = Flask(__name__)@app.route(/) def...
kron积计算mask类别矩阵
文章目录 1. 生成类别矩阵如下2. pytorch 代码3. 循环移动矩阵 1. 生成类别矩阵如下 2. pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0…...
Redis实现消息队列
什么是消息列队。 消息队列是一种应用间的异步协作机制,同时消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削峰等问题。实现高性能,高可用,可伸缩和最终一致性架构。市面上的 M…...
vue+springboot+webtrc+websocket实现双人音视频通话会议
前言 最近一些时间我有研究,如何实现一个视频会议功能,但是找了好多资料都不太理想,最终参考了一个文章 WebRTC实现双端音视频聊天(Vue3 SpringBoot) 只不过,它的实现效果里面只会播放本地的mp4视频文件&…...
【免费送书活动】《MySQL 9从入门到性能优化(视频教学版)》
本博主免费赠送读者3本书,书名为《MySQL 9从入门到性能优化(视频教学版)》。 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 这本书已经公开…...
【设计模式】【行为型模式】命令模式(Command)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
1.14学习总结
日常刷题单 刷了题目后,对于排序方法更加熟练,手搓代码的速度也得到了提高。 感觉字符串还不熟练,高精度更是云里雾里,上升空间极大。 同时看见今晚有个入门难度的测试,去练了练手,想看看自己是什么成分&…...
QxOrm生成json
下载Qxorm-1.5版本 使用vs打开项目,直接生成即可: lib目录中会生成dll和lib文件 新建Qt项目使用Qxorm: 将QxOrm中上面三个目录拷贝到新建的Qt项目中 pro文件添加使用QxOrm第三方库 INCLUDEPATH $$PWD/include/ LIBS -L"$$PWD/lib" LIBS…...
伯克利 CS61A 课堂笔记 09 —— Data Abstraction
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Data Abstraction 数据抽象 Ⅰ Rational Numbers Ⅱ Rational Number Arithmetic 02 Pairs 对 Ⅰ Representing Pairs Using Lists Ⅱ Re…...
高频 SQL 50 题(基础版)
高频 SQL 50 题(基础版) 查询连接聚合函数排序和分组高级查询和连接子查询高级字符串函数 / 正则表达式 / 子句 查询 链接: link 链接: link 链接: link 链接: link 链接: link 连接 链接: 高频 SQL 50 题基础版_1378. 使用唯一标识码替换员工ID 链接…...
HtmlRAG:RAG系统中,HTML比纯文本效果更好
HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法,在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。 方法 其实主要看下围绕html提纯思路,将提纯后的…...
python学opencv|读取图像(六十二)使用cv2.morphologyEx()形态学函数实现图像梯度处理
【1】引言 前序已经学习了腐蚀和膨胀的单独作用函数,还研究了按照不同顺序调用腐蚀和膨胀函数调整图像效果,相关文章包括且不限于: python学opencv|读取图像(六十一)先后使用cv2.dilate()函数和cv2.erode()函数实现图…...
10G EPON光模块
一、10G EPON对称光模块 工作模式:上行突发接收、下行连续发射。 工作原理:当需要发送信号时,系统信号通过光模块的电接口把信号传送到驱动芯片,芯片处理后,驱动激光器发出调制光信号,经光纤发到远端&…...
RocketMQ与kafka如何解决消息丢失问题?
0 前言 消息丢失基本是分布式MQ中需要解决问题,消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时,在生产者、Broker和消费者之间如何解决消息丢失问题。 1.Rocket…...
每日Attention学习23——KAN-Block
模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…...
【前端】ES6新特性汇总
本文作者: slience_me ES6新特性汇总 1. let声明变量 1)let作用域 // var 声明的变量往往会越域 // let 声明的变量有严格的局部作用域 {var a 1;let b 2; } console.log(a); // 1 console.log(b); // 报错 b is not defined2)声明次数 …...
2024 CyberHost 语音+图像-视频
项目:CyberHost: Taming Audio-driven Avatar Diffusion Model with Region Codebook Attention 音频驱动的身体动画面临两个主要挑战:(1)关键人体部位,如面部和手部,在视频帧中所占比例较小&#x…...
Git命令摘录
使用 Git 升级软件通常是指通过 Git 仓库获取软件的最新版本或更新代码。以下是详细的步骤和方法: 1. 克隆软件仓库 如果这是你第一次获取软件代码,可以使用 git clone 命令将远程仓库克隆到本地。 git clone <仓库地址> 例如: git cl…...
DeepSeek24小时写作机器人,持续创作高质量文案
内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求,人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容?DeepSeek写作机器人,一款24小时持续创作的智能工具,为企业和个人提…...
Python 面向对象的三大特征
前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路 面向对象的…...
在mac中安装Colima使用docker(替代Docker Desktop)
目录 推荐方案:Colima Docker CLI(原生 ARM 支持) 步骤 1: 安装必需工具 步骤 2: 启动 Colima (优化 ARM 虚拟机) 步骤 3: 绑定 Docker CLI 到 Colima 步骤 4: 验证 Docker 运行 方案对比与注意事项 常见陷阱 卸载残留配置ÿ…...
YOLO11网络结构以及改进1
YOLO11 1.YOLO11网络结构图在哪里?2.对应的网络结构图3.每一个模块详解3.1 Conv模块3.2关于卷积模块3.3 关于给各个模块指定参数的细节 4.加入CBAM 1.YOLO11网络结构图在哪里? 2.对应的网络结构图 3.每一个模块详解 3.1 Conv模块 位置:ultr…...
EtherNetIP转ModbusTCP网关,给风电注入“超级赛亚人”能量
EtherNetIP转ModbusTCP网关,给风电注入“超级赛亚人”能量 在工业通信领域,常常需要将不同网络协议的设备和系统连接起来,以实现更高效的数据交互和系统集成。比如,把EtherNet/IP设备及其网络连接到ModbusTCP网络系统,…...
30天开发操作系统 第 20 天 -- API
前言 大家早上好,今天我们继续努力哦。 昨天我们已经实现了应用程序的运行, 今天我们来实现由应用程序对操作系统功能的调用(即API, 也叫系统调用)。 为什么这样的功能称为“系统调用”(system call)呢?因为它是由应用程序来调用(操作)系统中的功能来完…...
DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件
1 DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件 1.1 背景 AI能力再强,如果不能在企业的自有业务上产生助益,那基本也是一无是处。将企业的自有业务上传到线上训练,那是脑子进水的做法ÿ…...
在香橙派5 NPU上使用Yolov5
【香橙派】使用NPU部署Yolov5的完整解决方案 香橙派使用NPU部署Yolov5的完整解决方案 Orangepi 5 Pro(香橙派5pro)部署yolov5 RK3588实战:调用npu加速,yolov5识别图像、ffmpeg发送到rtmp服务器 香橙派5 RK3588 yolov5模型转换rknn及部署踩坑全记录 orang…...
常用排序算法
1. 基础排序算法 1.1 冒泡排序(Bubble Sort) 原理: 依次比较相邻元素,将较大的元素逐步"冒泡"到右侧。 def bubble_sort(arr):n len(arr)for i in range(n):swapped Falsefor j in range(0, n-i-1):if arr[j] >…...
MySQL判空函数--IFNULL函数的使用
文章目录 IFNULL函数介绍IFNULL函数的语法举例相关扩展 IFNULL函数介绍 在MySQL中,IFNULL函数用于判断给定的表达式是否为NULL。如果表达式为NULL,则IFNULL函数返回指定的替代值;如果表达式不为NULL,则返回表达式本身的值。 IFN…...
Git 设置代理
设置 HTTP 和 HTTPS 代理 运行以下命令来配置 Git 的 HTTP 和 HTTPS 代理: git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy https://127.0.0.1:7890 验证代理设置 你可以通过以下命令检查代理是否设置成功: g…...
nsc account 及user管理
从安全角度,推荐使用sign 模式进行nats account及用户管理 把权限放到account level 用户密码泄露可以通过快速更换用户可以设置过期日期,进行安全轮换 此外通过nsc 管理用户和权限,可以统一实现全局管控,包括subject管控&#…...
llama.cpp部署 DeepSeek-R1 模型
一、llama.cpp 介绍 使用纯 C/C推理 Meta 的LLaMA模型(及其他模型)。主要目标llama.cpp是在各种硬件(本地和云端)上以最少的设置和最先进的性能实现 LLM 推理。纯 C/C 实现,无任何依赖项Apple 芯片是一流的——通过 A…...
NO.18十六届蓝桥杯备战|循环嵌套|乘法表|斐波那契|质数|水仙花数|(C++)
循环嵌套 循环嵌套的使⽤ while , do while , for ,这三种循环往往会嵌套在⼀起才能更好的解决问题,就是我们所说的:循环嵌套。这三种循环都可以任意嵌套使⽤ ⽐如: 写⼀个代码,打印⼀个乘法⼝…...
用什么办法能实现ubuntu里面运行的自己开发的python程序能自动升级。
要实现Ubuntu中自己开发的Python程序自动升级,可以通过以下几种方式: 1. 使用 Git 仓库 定时任务 如果你的Python程序托管在Git仓库中,可以通过定时拉取最新代码来实现自动升级。 步骤: 确保Python程序在Git仓库中。在Ubuntu上…...