前端面试六之axios

一、axios简介

        Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境。在浏览器端,Axios 的底层实现是基于原生的 XMLHttpRequest(XHR)。它对 XHR 进行了封装,增加了 Promise 支持、自动转换 JSON 数据、请求和响应拦截器等功能。在 Node.js 环境中,Axios 使用 http 模块来发起请求。

1.1XHR、Fetch API 和 Axios 的区别

1. XMLHttpRequest (XHR)
  • 定义:XHR 是一个较旧的 API,用于在浏览器中发起网络请求。

  • 工作原理:基于事件驱动,通过监听 onreadystatechange 事件来处理请求状态变化。

  • 优点

    • 兼容性好,支持较旧的浏览器。

    • 提供了丰富的 API,可以实现复杂的网络请求操作。

  • 缺点

    • 基于回调,容易导致回调地狱,代码难以维护。

    • 无法中止请求。

    • 需要手动设置请求头和解析响应。

  • 使用场景:适用于需要兼容旧浏览器的场景。

 Fetch API
  • 定义:Fetch 是一个现代的、基于 Promise 的网络请求接口,用于替代 XHR。

  • 工作原理:基于 Promise,使用 Promise 对象来处理异步请求。

  • 优点

    • 语法简洁,使用 Promise 避免了回调地狱。

    • 支持中止请求(通过 AbortController)。

    • 更好的错误处理。

    • 支持流式传输,适用于大文件上传和下载。

  • 缺点

    • 兼容性较差,在一些较老的浏览器中不支持。

    • 响应处理需要手动调用 .json().text() 等方法。

    • 默认不接受跨域请求,需要通过 CORS 配置。

  • 使用场景:适用于现代 Web 开发,不需要考虑较旧浏览器版本的场景。

3. Axios
  • 定义:Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境。

  • 工作原理:本质上是对 XHR 的封装,在浏览器端使用 XHR,在 Node.js 中使用 http 模块。

  • 优点

    • 基于 Promise,支持 async/await

    • 自动转换 JSON 数据。

    • 支持请求和响应拦截器。

    • 能够取消请求。

  • 缺点

    • 需要额外引入库。

    • 在一些极端情况下(如超时控制)可能不如原生 Fetch 灵活。

  • 使用场景:适用于需要更丰富的功能(如拦截器、自动数据转换)的场景。

  1.2axios基于 Promise

Axios 的请求返回的是一个 Promise 对象,这使得它能够很方便地进行异步操作的处理。例如,你可以使用 .then() 方法来处理请求成功的情况,使用 .catch() 方法来处理请求失败的情况。比如:

axios.get('/user').then(response => {console.log(response.data); // 处理成功响应}).catch(error => {console.error(error); // 处理错误});

二、演示get和post

<template><div><h1>Axios GET 和 POST 示例</h1><button @click="fetchData">获取数据 (GET)</button><button @click="postData">提交数据 (POST)</button><div v-if="data"><h2>获取的数据:</h2><pre>{{ data }}</pre></div><div v-if="postDataResponse"><h2>POST 请求的响应:</h2><pre>{{ postDataResponse }}</pre></div></div>
</template><script>
import axios from 'axios';export default {data() {return {data: null, // 用于存储 GET 请求的响应数据postDataResponse: null, // 用于存储 POST 请求的响应数据};},methods: {// 发起 GET 请求fetchData() {axios.get('https://jsonplaceholder.typicode.com/posts/1').then(response => {this.data = response.data; // 将响应数据存储到 data 中}).catch(error => {console.error('GET 请求失败:', error);});},// 发起 POST 请求postData() {const postData = {title: 'foo',body: 'bar',userId: 1,};axios.post('https://jsonplaceholder.typicode.com/posts', postData).then(response => {this.postDataResponse = response.data; // 将响应数据存储到 postDataResponse 中}).catch(error => {console.error('POST 请求失败:', error);});},},
};
</script><style>
/* 添加一些简单的样式 */
button {margin-right: 10px;
}
</style>
(1)GET 请求
  • 使用 axios.get 方法发起 GET 请求。

  • 请求的 URL 是 https://jsonplaceholder.typicode.com/posts/1,这是一个公共的测试 API,返回一个模拟的帖子数据。

  • 请求成功后,将响应数据存储到 data 属性中,并在页面上显示。

(2)POST 请求
  • 使用 axios.post 方法发起 POST 请求。

  • 请求的 URL 是 https://jsonplaceholder.typicode.com/posts,同样是一个公共的测试 API。

  • 请求体是一个包含 titlebodyuserId 的对象。

  • 请求成功后,将响应数据存储到 postDataResponse 属性中,并在页面上显示。

使用 async/await

methods: {async fetchData() {try {const response = await axios.get('https://jsonplaceholder.typicode.com/posts/1');this.data = response.data;} catch (error) {console.error('GET 请求失败:', error);}},async postData() {const postData = {title: 'foo',body: 'bar',userId: 1,};try {const response = await axios.post('https://jsonplaceholder.typicode.com/posts', postData);this.postDataResponse = response.data;} catch (error) {console.error('POST 请求失败:', error);}},
},

 三、发送带有请求头和查询参数的请求

<template><div><h1>Axios 请求头和查询参数示例</h1><button @click="fetchWithHeadersAndParams">发送请求</button><div v-if="response"><h2>响应数据:</h2><pre>{{ response }}</pre></div></div>
</template><script>
import axios from 'axios';export default {data() {return {response: null, // 用于存储响应数据};},methods: {// 发送带有请求头和查询参数的 GET 请求fetchWithHeadersAndParams() {// 定义请求头const headers = {'Authorization': 'Bearer your_token_here','Custom-Header': 'CustomValue',};// 定义查询参数const params = {userId: 1,limit: 10,status: 'active',};// 发起请求axios.get('https://jsonplaceholder.typicode.com/posts', {headers: headers, // 添加请求头params: params,  // 添加查询参数}).then(response => {this.response = response.data; // 将响应数据存储到 response 中}).catch(error => {console.error('请求失败:', error);this.response = { error: error.message }; // 如果失败,存储错误信息});},},
};
</script><style>
button {margin-right: 10px;
}
</style>
(1)请求头
  • axios.get 方法中,通过 headers 属性传递自定义请求头。

  • 示例中添加了 AuthorizationCustom-Header 两个请求头。

(2)查询参数
  • axios.get 方法中,通过 params 属性传递查询参数。

  • 查询参数会自动被 Axios 转换为 URL 的查询字符串。例如,params 对象 { userId: 1, limit: 10 } 会被转换为 ?userId=1&limit=10

(3)完整的请求 URL

假设请求头和查询参数都设置好后,最终的请求 URL 会类似于:

https://jsonplaceholder.typicode.com/posts?userId=1&limit=10&status=active

 使用 async/await

methods: {async fetchWithHeadersAndParams() {const headers = {'Authorization': 'Bearer your_token_here','Custom-Header': 'CustomValue',};const params = {userId: 1,limit: 10,status: 'active',};try {const response = await axios.get('https://jsonplaceholder.typicode.com/posts', {headers: headers,params: params,});this.response = response.data;} catch (error) {console.error('请求失败:', error);this.response = { error: error.message };}},
},

四、发送不同格式的请求体

在 Vue 项目中使用 Axios 发送请求时,可以通过配置请求体的格式来满足不同的需求。以下是三种常见的请求体格式的示例:application/x-www-form-urlencodedmultipart/form-dataapplication/json

<template><div><h1>Axios 请求体格式示例</h1><button @click="sendUrlEncoded">发送 URL 编码数据</button><button @click="sendMultipart">发送 Multipart 数据</button><button @click="sendJson">发送 JSON 数据</button><div v-if="response"><h2>响应数据:</h2><pre>{{ response }}</pre></div></div>
</template><script>
import axios from 'axios';export default {data() {return {response: null, // 用于存储响应数据};},methods: {// 发送 URL 编码数据sendUrlEncoded() {const data = new URLSearchParams();data.append('username', 'kimi');data.append('password', '123456');axios.post('https://jsonplaceholder.typicode.com/posts', data).then(response => {this.response = response.data;}).catch(error => {console.error('请求失败:', error);this.response = { error: error.message };});},// 发送 Multipart 数据sendMultipart() {const formData = new FormData();formData.append('file', new Blob(['Hello World'], { type: 'text/plain' }), 'example.txt');formData.append('description', 'This is a test file');axios.post('https://jsonplaceholder.typicode.com/posts', formData, {headers: {'Content-Type': 'multipart/form-data',},}).then(response => {this.response = response.data;}).catch(error => {console.error('请求失败:', error);this.response = { error: error.message };});},// 发送 JSON 数据sendJson() {const data = {title: 'foo',body: 'bar',userId: 1,};axios.post('https://jsonplaceholder.typicode.com/posts', data).then(response => {this.response = response.data;}).catch(error => {console.error('请求失败:', error);this.response = { error: error.message };});},},
};
</script><style>
button {margin-right: 10px;
}
</style>
(1)发送 URL 编码数据
  • 使用 URLSearchParams 构造请求体。

  • Axios 会自动将 URLSearchParams 转换为 application/x-www-form-urlencoded 格式。

  • 示例代码:

    const data = new URLSearchParams();
    data.append('username', 'kimi');
    data.append('password', '123456');axios.post('https://jsonplaceholder.typicode.com/posts', data);
    (2)发送 Multipart 数据
  • 使用 FormData 构造请求体。

  • 需要手动设置请求头 Content-Typemultipart/form-data

  • 示例代码:

    const formData = new FormData();
    formData.append('file', new Blob(['Hello World'], { type: 'text/plain' }), 'example.txt');
    formData.append('description', 'This is a test file');axios.post('https://jsonplaceholder.typicode.com/posts', formData, {headers: {'Content-Type': 'multipart/form-data',},
    });
    (3)发送 JSON 数据
  • 直接发送一个 JavaScript 对象。

  • Axios 会自动将对象序列化为 JSON 格式,并设置请求头 Content-Typeapplication/json

  • 示例代码:

    const data = {title: 'foo',body: 'bar',userId: 1,
    };axios.post('https://jsonplaceholder.typicode.com/posts', data);

    五、axios默认配置项

以下是一些常用的 Axios 默认配置项: 

配置项描述
baseURL基础 URL,请求时会自动拼接
headers请求头,可以设置通用头或特定方法的头
timeout请求超时时间(单位为毫秒)
withCredentials是否允许跨域请求携带凭证(如 cookies)
responseType响应数据类型(如 jsontextarraybuffer 等)
validateStatus定义哪些状态码被视为成功响应
transformRequest请求发送前的数据转换函数
transformResponse响应数据的转换函数

以下是一个完整的示例,展示如何设置全局默认配置和自定义实例默认配置:

// 设置全局默认配置
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = 'Bearer your_token_here';
axios.defaults.timeout = 3000;// 创建自定义实例
const customInstance = axios.create({baseURL: 'https://api.custom.com',headers: {'Content-Type': 'application/json'}
});// 修改实例的默认配置
customInstance.defaults.timeout = 5000;// 使用全局配置发起请求
axios.get('/user').then(response => {console.log(response.data);
});// 使用自定义实例发起请求
customInstance.get('/custom-user').then(response => {console.log(response.data);
});

1. 全局默认配置

Axios 允许通过 axios.defaults 设置全局默认配置,这些配置将应用于所有通过 axios 发起的请求。以下是一些常见的全局默认配置:

基础 URL (baseURL):为所有请求设置一个基础 URL,请求的 URL 会自动拼接在 baseURL 后面。

axios.defaults.baseURL = 'https://api.example.com';

请求头 (headers):设置通用的请求头或特定方法的请求头。

axios.defaults.headers.common['Authorization'] = 'Bearer your_token_here';
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

超时时间 (timeout):设置请求的超时时间(单位为毫秒),超过该时间未响应则请求会被中断。

axios.defaults.timeout = 2500; // 2.5 秒

验证状态码 (validateStatus):定义哪些 HTTP 状态码被视为成功响应。

axios.defaults.validateStatus = function (status) {return status >= 200 && status < 300; // 默认值
};

2. 自定义实例默认配置

除了全局配置,Axios 还允许创建自定义实例,并为每个实例设置默认配置。这在项目中需要使用多个不同配置的 Axios 实例时非常有用:

const instance = axios.create({baseURL: 'https://api.example.com',timeout: 3000,headers: {'Authorization': 'Bearer your_token_here'}
});// 修改实例的默认配置
instance.defaults.headers.common['Custom-Header'] = 'CustomValue';

3. 配置的优先级

Axios 的配置会按优先级合并,优先级从低到高依次为:

  1. 库默认值:在 lib/defaults.js 中定义的默认值。

  2. 实例的 defaults 属性:通过 axios.create() 创建的实例的默认配置。

  3. 请求的 config 参数:在每次请求中传递的配置参数。

    const instance = axios.create({timeout: 2500 // 实例默认超时时间
    });instance.get('/longRequest', {timeout: 5000 // 该请求的超时时间覆盖实例默认值
    });

    六、axios响应数据的格式和状态码

在使用 Axios 发起 HTTP 请求时,响应数据的格式和状态码是两个非常重要的部分。Axios 提供了丰富的响应数据结构,同时允许你根据状态码来处理不同的响应情况。 

1. Axios 响应格式

当 Axios 发起请求并收到响应时,它会返回一个响应对象,该对象包含以下属性:

  • data:响应体的内容。Axios 会根据 Content-Type 自动解析响应体。如果是 application/json,它会被解析为 JavaScript 对象。

  • status:HTTP 状态码(如 200404500 等)。

  • statusText:HTTP 状态消息(如 OKNot FoundInternal Server Error 等)。

  • headers:响应头,是一个对象,包含服务器返回的所有响应头。

  • config:请求的配置对象,包含了请求时传递的配置信息。

  • request:原生的请求对象(在浏览器中是 XMLHttpRequest,在 Node.js 中是 http.ClientRequest)。

示例:响应格式

以下是一个示例,展示如何处理 Axios 的响应数据:

import axios from 'axios';axios.get('https://jsonplaceholder.typicode.com/posts/1').then(response => {console.log('响应数据:', response.data); // 响应体内容console.log('状态码:', response.status); // HTTP 状态码console.log('状态消息:', response.statusText); // HTTP 状态消息console.log('响应头:', response.headers); // 响应头console.log('请求配置:', response.config); // 请求配置}).catch(error => {console.error('请求失败:', error);});

2. 状态码处理

HTTP 状态码是服务器对请求的响应状态的描述。常见的状态码包括:

  • 2xx:成功

    • 200 OK:请求成功。

    • 201 Created:请求成功,且服务器创建了新资源。

    • 204 No Content:请求成功,但没有返回内容。

  • 3xx:重定向

    • 301 Moved Permanently:请求的资源已永久移动到新位置。

    • 302 Found:请求的资源临时移动到新位置。

  • 4xx:客户端错误

    • 400 Bad Request:请求格式错误。

    • 401 Unauthorized:未授权,需要认证。

    • 403 Forbidden:禁止访问。

    • 404 Not Found:请求的资源不存在。

  • 5xx:服务器错误

    • 500 Internal Server Error:服务器内部错误。

    • 502 Bad Gateway:网关错误。

    • 503 Service Unavailable:服务不可用。

示例:根据状态码处理响应

以下是一个示例,展示如何根据状态码处理不同的响应情况:

import axios from 'axios';axios.get('https://jsonplaceholder.typicode.com/posts/1').then(response => {console.log('响应数据:', response.data);// 根据状态码处理响应switch (response.status) {case 200:console.log('请求成功:', response.data);break;case 404:console.error('资源未找到');break;case 500:console.error('服务器内部错误');break;default:console.log('其他状态码:', response.status);}}).catch(error => {console.error('请求失败:', error);// 处理错误响应if (error.response) {console.error('状态码:', error.response.status);console.error('状态消息:', error.response.statusText);} else if (error.request) {console.error('请求已发送,但未收到响应');} else {console.error('请求配置错误:', error.message);}});

3. 自定义状态码处理

你可以通过 validateStatus 配置项自定义哪些状态码被视为成功响应。默认情况下,只有 2xx 状态码被视为成功,但你可以修改这个行为:

import axios from 'axios';axios.get('https://jsonplaceholder.typicode.com/posts/1', {validateStatus: function (status) {return status >= 200 && status < 400; // 将 2xx 和 3xx 状态码视为成功}
})
.then(response => {console.log('响应数据:', response.data);
})
.catch(error => {console.error('请求失败:', error);
});

七、Axios 的请求拦截器和响应拦截器

Axios 的请求拦截器和响应拦截器是 Axios 提供的强大功能,用于在请求发送之前和响应返回之后对数据进行处理。它们可以用于多种场景,例如统一设置请求头、添加认证信息、处理错误、格式化响应数据等。

1. 请求拦截器

请求拦截器可以在请求发送之前对请求进行处理。你可以通过 axios.interceptors.request.use() 方法添加请求拦截器。

示例:添加请求拦截器

以下是一个示例,展示如何在请求拦截器中统一设置请求头和添加认证信息:

import axios from 'axios';// 添加请求拦截器
axios.interceptors.request.use(config => {// 在发送请求之前做些什么config.headers['Authorization'] = 'Bearer your_token_here'; // 添加认证信息config.headers['Custom-Header'] = 'CustomValue'; // 添加自定义请求头return config;},error => {// 对请求错误做些什么return Promise.reject(error);}
);// 测试请求
axios.get('https://jsonplaceholder.typicode.com/posts/1').then(response => {console.log('响应数据:', response.data);}).catch(error => {console.error('请求失败:', error);});

2. 响应拦截器

响应拦截器可以在响应返回之后对响应进行处理。你可以通过 axios.interceptors.response.use() 方法添加响应拦截器。

示例:添加响应拦截器

以下是一个示例,展示如何在响应拦截器中统一处理响应数据和错误:

import axios from 'axios';// 添加响应拦截器
axios.interceptors.response.use(response => {// 对响应数据做点什么console.log('响应状态码:', response.status);return response.data; // 只返回响应数据},error => {// 对响应错误做点什么if (error.response) {// 请求已发出,但服务器响应的状态码不在 2xx 范围内console.error('响应状态码:', error.response.status);console.error('响应消息:', error.response.statusText);} else if (error.request) {// 请求已发出,但没有收到响应console.error('请求已发出,但未收到响应');} else {// 在设置请求时发生了一些事情,触发了一个错误console.error('请求配置错误:', error.message);}return Promise.reject(error);}
);// 测试请求
axios.get('https://jsonplaceholder.typicode.com/posts/1').then(response => {console.log('响应数据:', response);}).catch(error => {console.error('请求失败:', error);});

3. 自定义实例的拦截器

除了全局拦截器,你还可以为自定义的 Axios 实例添加拦截器。这在项目中需要使用多个不同配置的 Axios 实例时非常有用。

示例:为自定义实例添加拦截器
import axios from 'axios';// 创建自定义实例
const customInstance = axios.create({baseURL: 'https://api.example.com',timeout: 3000,
});// 为自定义实例添加请求拦截器
customInstance.interceptors.request.use(config => {config.headers['Authorization'] = 'Bearer your_token_here';return config;},error => {return Promise.reject(error);}
);// 为自定义实例添加响应拦截器
customInstance.interceptors.response.use(response => {return response.data; // 只返回响应数据},error => {console.error('请求失败:', error);return Promise.reject(error);}
);// 使用自定义实例发起请求
customInstance.get('/posts/1').then(response => {console.log('响应数据:', response);}).catch(error => {console.error('请求失败:', error);});

4. 移除拦截器

如果需要移除某个拦截器,可以通过返回的 id 来移除它:

import axios from 'axios';// 添加请求拦截器并获取 id
const requestInterceptorId = axios.interceptors.request.use(config => {config.headers['Authorization'] = 'Bearer your_token_here';return config;},error => {return Promise.reject(error);}
);// 移除请求拦截器
axios.interceptors.request.eject(requestInterceptorId);// 添加响应拦截器并获取 id
const responseInterceptorId = axios.interceptors.response.use(response => {return response.data;},error => {return Promise.reject(error);}
);// 移除响应拦截器
axios.interceptors.response.eject(responseInterceptorId);

5. 使用场景

(1)请求拦截器
  • 统一设置请求头:例如,添加认证信息(如 Authorization)、内容类型(如 Content-Type)等。

  • 添加公共参数:例如,为每个请求添加时间戳或用户 ID。

  • 请求取消:通过 CancelTokenAbortController 实现请求取消功能。

(2)响应拦截器
  • 统一处理响应数据:例如,只返回响应体中的数据部分。

  • 统一处理错误:例如,根据状态码显示不同的错误消息。

  • 处理重定向:例如,根据状态码(如 401)跳转到登录页面。

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

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

相关文章

模板方法模式Template Method Pattern

模式定义 定义一个操作中算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 类行为型模式 模式结构 AbstractClass&#xff1a;抽象类ConcreteClass&#xff1a;具体子类 只有类之间的继…

【行云流水AI笔记】游戏里面的强化学习使用场景

强化学习在游戏中的应用已从早期的棋类博弈扩展到现代复杂游戏的全流程优化&#xff0c;以下是结合最新技术进展的核心应用场景及典型案例&#xff1a; 一、竞技游戏的策略突破 1. 策略博弈类游戏 代表案例&#xff1a;AlphaGo/AlphaZero&#xff08;围棋&#xff09;、Alph…

使用Python和PyTorch框架,基于RetinaNet模型进行目标检测,包含数据准备、模型训练、评估指标计算和可视化

下面是一个完整的实现方案,使用Python和PyTorch框架,基于RetinaNet模型进行目标检测,包含数据准备、模型训练、评估指标计算和可视化。 import os import numpy as np import matplotlib.pyplot as plt import torch import torchvision from torchvision.models.detection…

springboot服务如何获取pod当前ip方案及示例

在 Kubernetes 集群中&#xff0c;Spring Boot 服务获取 Pod 当前 IP 的方案主要有两种&#xff1a;通过环境变量注入 或 通过 Java 代码动态获取网络接口 IP。以下是两种方案的详细说明及示例&#xff1a; 方案一&#xff1a;通过 Kubernetes Downward API 注入环境变量 原理…

1.MySQL三层结构

1.所谓安装的Mysql数据库&#xff0c;就是在电脑上安装了一个数据库管理系统&#xff08;【DBMS】database manage system&#xff09;&#xff0c;这个管理程序可以管理多个数据库。 2.一个数据库中可以创建多个表&#xff0c;以保存数据&#xff08;信息&#xff09;。【数据…

[深度学习]目标检测基础

目录 一、实验目的 二、实验环境 三、实验内容 3.1 LM_BoundBox 3.1.1 实验代码 3.1.2 实验结果 3.2 LM_Anchor 3.2.1 实验代码 3.2.2 实验结果 3.3 LM_Multiscale-object-detection 3.3.1 实验代码 3.3.2 实验结果 四、实验小结 一、实验目的 了解python语…

ALOHA机器人平台:低成本、高精度双臂操作及其进展深度解析

原创1从感知决策到具身智能的技术跃迁与挑战(基座模型与VLA模型)2ALOHA机器人平台&#xff1a;低成本、高精度双臂操作及其进展深度解析3(上)通用智能体与机器人Transformer&#xff1a;Gato和RT-1技术解析及与LLM Transformer的异同4(下)通用智能体与机器人Transformer&#x…

C++: 类 Class 的基础用法

&#x1f3f7;️ 标签&#xff1a;C、面向对象、类、构造函数、成员函数、封装、继承、多态 &#x1f4c5; 更新时间&#xff1a;2025年6月15日 &#x1f4ac; 欢迎在评论区留言交流你的理解与疑问&#xff01; 文章目录 前言一、什么是类&#xff1f;二、类的定义1.基本语法2.…

Java EE与Jakarta EE命名空间区别

在 Java 生态中&#xff0c;javax 和 jakarta 代表了 企业级 Java 规范&#xff08;Java EE/Jakarta EE&#xff09;的命名空间演进&#xff0c;核心区别在于归属权和管理组织的变更。以下是详细对比&#xff1a; 1. 历史背景 javax&#xff1a; 源自 Java EE&#xff08;Java …

2 Studying《Arm A715 Technical Reference Manual》

目录 2. The Cortex‑A715 core 2.1 Cortex‑A715 core features 2.2 Cortex‑A715 core confifiguration options 2.3 DSU-110 dependent features 2.4 Supported standards and specifications 2.6 Design tasks 3. Technical overview 3.1 Core components 3.2 Int…

使用Nodejs尝试小程序后端服务编写:简单的待办事项管理demo

文章目录 结构demo步骤demo运行效果API测试(1) 添加待办事项(2) 获取所有待办事项(3) 切换完成状态(4) 删除待办事项 API测试-RESTClient一些其他的高级功能环境变量管理不同环境配置授权认证 测试需要登录的接口保存响应测试脚本编写自动化测试 bug解决 结构 尝试写一个简单的…

CSS“多列布局”

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​col…

Pump上狙击机制的功能优势和实战教学

加密世界的发展永远伴随着速度的革命。无论是新的 Token 上线&#xff0c;还是热点项目的第一波流动性注入&#xff0c;抢先一步往往意味着利润的几何级增长。在这个讲究「秒杀」与「先机」的赛道中&#xff0c;一项关键策略正悄然成为链上操作者的常规武器——狙击&#xff08…

条件收敛的级数中项必须趋于 0,正负项抵消,但趋于 0 的速度不需要“足够快”

条件收敛的级数中&#xff0c;项必须趋于 0&#xff0c;但趋于 0 的速度不需要“足够快”的原因可以从以下几个方面理解&#xff1a; 1. 收敛的必要条件&#xff1a;项趋于 0 对于任何收敛的级数&#xff08;无论是绝对收敛还是条件收敛&#xff09;&#xff0c;都必须满足 li…

Tomcat 和 Spring MVC

Tomcat 和 Spring MVC 是 Java Web 开发中两大核心组件&#xff0c;分别承担不同的角色&#xff1a; 一、Tomcat 定义 Apache Tomcat 是一个开源的 Servlet 容器&#xff08;也称为 Servlet 引擎&#xff09;&#xff0b; JSP 引擎&#xff0c;实现了 Java EE&#xff08;现称 …

【微服务】134:SpringCloud

今天是刘小爱自学Java的第134天。 感谢你的观看&#xff0c;谢谢你。 image 学习内容安排如下&#xff1a; SpringCloud的接触。利用SpringCloud搭建微服务架构&#xff0c;当然这个估计要3天时间才能完成&#xff0c;今天主要是注册中心Eureka的学习。 一、SpringCloud 微服务…

三次贝塞尔曲线,二次贝塞尔曲线有什么区别

三次贝塞尔曲线和二次贝塞尔曲线在控制点数量、数学表达式和曲线复杂度上有所不同。以下是它们的主要区别&#xff1a; 1. 控制点数量 二次贝塞尔曲线&#xff1a;由3 个点定义&#xff08;起点、终点和 1 个控制点&#xff09;。三次贝塞尔曲线&#xff1a;由4 个点定义&…

springboot集成dubbo

BeanDefinitionRegistryPostProcessor public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {/*** 允许开发者在Spring容器加载Bean定义(BeanDefinition)后&#xff0c;实例化Bean之前&#xff0c;动态修改或注册新的BeanDefinition* 该接…

Seata 全面深入学习指南

Seata 全面深入学习指南 学习目录 第一部分:Seata 基础篇 分布式事务基础概念Seata 概述与核心架构Seata 部署与快速入门第二部分:Seata 核心机制 Seata 事务模式详解 AT 模式TCC 模式SAGA 模式XA 模式Seata 事务协调机制Seata 高可用设计第三部分:Seata 高级特性 Seata 配…

【Linux】基于策略模式的简单日志设计

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——基于策略模式的简单日志设计 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语…