当前位置: 首页 > news >正文

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&…...

本地搭建自己的专属客服之OneApi关联Ollama部署的大模型并创建令牌《下》

这里写目录标题 OneApi1、渠道设置2、令牌创建 配置文件修改修改配置文件docker-compose.yml修改config.json到此结束 上文讲了如何本地docker部署fastGtp,相信大家也都已经部署成功了!!! 今天就说说怎么让他们连接在一起 创建你的…...

Win10环境借助DockerDesktop部署最新MySQL9.2

Win10环境借助DockerDesktop部署最新MySQL9.2 前言 作为一杆主要撸Java的大数据平台开发攻城狮,必不可少要折腾各种组件,环境和版本一直是很头疼的事情。虽然可以借助Anaconda来托管Python的环境,也可以使用多个虚拟机来部署不同的环境&…...

【Maven】多module项目优雅的实现pom依赖管理

【Maven】多module项目优雅的实现pom依赖管理 【一】方案设计原则【二】项目结构示例【三】实现思路【1】可能的问题点:【2】解决方案的思路:【3】需要注意的地方:【4】可能的错误: 【四】实现案例【1】父POM设计(pare…...

前端vue引入特殊字体不生效

引入特殊字体ttf,TTF等发现开发环境中生效,项目部署后不生效何解? 1. 本地生效的原因 本地使用的是本地的资源,控制台可以看到对ttf文件的请求与加载。 2.部署后不生效的原因与解决 控制台可以看到对ttf资源文件的请求加载失败…...

【Linux】--- 基础开发工具之yum/apt、vim、gcc/g++的使用

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Linux网络编程 本篇博客我们来认识一下Linux中的一些基础开发工具 --- yum,vim,gcc/g。 🏠 yum 🎸 什么是yum 当用户想下载软…...

WEB安全--SQL注入--INTO OUTFILE

一、INTO OUTFILE 函数语法: SELECT column1, column2, INTO OUTFILE file_path FROM your_table WHERE your_conditions; 使用此方式在SQL注入的过程中可以: 1、上传shell得到数据库的后端的操作权限 2、爆出数据库的信息 二、使用该函数的条件&#…...

如何从0开始将vscode源码编译、运行、打包桌面APP

** 网上关于此的内容很少,今天第二次的完整运行了,按照下文的顺序走不会出什么问题。最重要的就是环境的安装,否则极其容易报错,请参考我的依赖版本以及文末附上的vscode官方指南 ** 第一步:克隆 VSCode 源码 首先…...

关于视频去水印的一点尝试

一. 视频去水印的几种方法 1. 使用ffmpeg delogo滤镜 delogo 滤镜的原理是通过插值算法,用水印周围的像素填充水印的位置。 示例: ffmpeg -i input.mp4 -filter_complex "[0:v]delogox420:y920:w1070:h60" output.mp4 该命令表示通过滤镜…...

如何在 Java 应用中实现数据库的主从复制(读写分离)?请简要描述架构和关键代码实现?

在Java应用中实现数据库主从复制(读写分离) 一、架构描述 (一)整体架构 主库(Master) 负责处理所有的写操作(INSERT、UPDATE、DELETE等)。它是数据的源头,所有的数据变…...

【css】width:100%;padding:20px;造成超出100%宽度的解决办法 - box-sizing的使用方法 - CSS布局

问题 修改效果 解决方法 .xx {width: 100%;padding: 0 20px;box-sizing: border-box; } 默认box-sizing: content-box下, width 内容的宽度 height 内容的高度 宽度和高度的计算值都不包含内容的边框(border)和内边距(padding&…...

【TI C2000】F28002x的系统延时、GPIO配置及SCI(UART)串口发送、接收

【TI C2000】F28002x的系统延时、GPIO配置及SCI(UART)串口发送、接收 文章目录 系统延时GPIO配置GPIO输出SCI配置SCI发送、接收测试附录:F28002x开发板上手、环境配置、烧录及TMS320F280025C模板工程建立F28002x叙述烧录SDK库文件说明工程建…...

【PyQt】信号与槽机制

PyQt信号与槽机制详解 🚀 一、信号与槽类型 🔌 1. 内置信号 📡 # 按钮点击信号 🖱️ QPushButton.clicked# 文本输入变化信号 ⌨️ QLineEdit.textChanged# 窗口关闭信号 🚪 QWidget.closeEvent2. 自定义信号 ✨ c…...

STM32 是什么?同类产品有哪些

STM32 是什么? STM32 是由意法半导体(STMicroelectronics)推出的基于 ARM Cortex-M 内核 的 32 位微控制器(MCU)系列。它专为高性能、低功耗的嵌入式应用设计,广泛应用于以下领域: 工业控制&am…...

20250213编译飞凌的OK3588-C_Linux5.10.209+Qt5.15.10_用户资料_R1

20250213编译飞凌的OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1 2025/2/13 11:43 缘起:飞凌发布了高版本内核的适配OK3588-C的Buildroot的SDK:OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1。 但是编译异常了。 于是按照百度升级libc6,可以…...

【DeepSeek】DeepSeek R1 本地windows部署(Ollama+Docker+OpenWebUI)

1、背景: 2025年1月,DeepSeek 正式发布 DeepSeek-R1 推理大模型。DeepSeek-R1 因其成本价格低廉,性能卓越,在 AI 行业引起了广泛关注。DeepSeek 提供了多种使用方式,满足不同用户的需求和场景。本地部署在数据安全、性…...

AI知识库 - Cherry Studio

1 引言: 最近 DeepSeek 很火啊,想必大家都知道,DeepSeek 这个开源的模型出来后,因其高质量能力和R1 的思维链引发了大家本地部署的热潮。我也不例外,本地部署了一个 14B 的模型,然后把,感觉傻傻…...

【ubuntu24.04】 强制重启导致大模型的磁盘挂载出错

挂载NTFS文件系统出错 各种模型放在了这个机械硬盘上,虽然速度慢,但是好在容量大。大模型在工作,但是程序看起来有问题,导致系统卡死了,然后我重启了,然后报错:wrong fs type bad option &…...

OpenLayer创建第一个基础地图实例

OpenLayers创建第一个基础地图实例 OpenLayers 是一个开源的 JavaScript 库,用于在网页上显示交互式地图。它支持多种地图源,包括 OpenStreetMap、Google Maps、Bing Maps 等。本文将介绍如何使用 OpenLayers 创建一个基础地图实例。 1. 准备工作 在开…...

Git命令摘录

使用 Git 升级软件通常是指通过 Git 仓库获取软件的最新版本或更新代码。以下是详细的步骤和方法&#xff1a; 1. 克隆软件仓库 如果这是你第一次获取软件代码&#xff0c;可以使用 git clone 命令将远程仓库克隆到本地。 git clone <仓库地址> 例如&#xff1a; git cl…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...