Axios 是什么?

目录

          一. 什么是Axios?

                1.axios的特性

                2.axios 的使用

          二. Axios 的实际应用

              1.axios请求的方式

              2.axios的适用场景

         三.Axios 和 ajax 的区别 

             1. axios 和ajax 的区别

             2.两者各自的优缺点

一,什么是Axios?

      Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post等请求,可以用在浏览器和 node.js 中。React等框架的出现,促使了Axios轻量级库的出现,因为Vue等,不需要操作Dom,所以不需要引入Jquery.js了。

1.axios的特性

从浏览器创建 XMLHttpRequests
从 node.js 创建 http 请求
支持 Promise API
拦截请求和响应
转换请求和响应数据
取消请求
自动转换JSON数据
客户端支持防御XSRF
  

2.axios 的使用

 首先要安装模块:

npm install axios
在cmd或者终端都可以 运行代码,引入模块后可以直接使用。

二.Axios 的实际应用

例如:

// 发起一个post请求
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});
1.axios请求的方式

axios.request(config)

axios.get(url[, config])

axios.delete(url[, config])

axios.post(url[, data[, config]])

.......

注:axios的请求方式有很多,我们常用的get ,post 请求,其他的并不常用。想要了解更多可以去axios官网。

// 第一种方式  将参数直接写在url中axios.get('/getMainInfo?id=123')
 
.then((res) => {
 
  console.log(res)
 
})
 
.catch((err) => {
 
  console.log(err)
 
})// 第二种方式  将参数直接写在params中axios.get('/getMainInfo', {  params: {
 
    id: 123
 
  }
 
})
 
.then((res) => {
 
  console.log(res)
 
})
 
.catch((err) => {
 
  console.log(err)
 
})

  2.axios的适用场景

在特性里面已经有提到,浏览器发送请求,或者Node.js发送请求都可以用到Axios。像Vue、React、Node等项目就可以使用Axios,如果你的项目里面用了Jquery,此时就不需要多此一举了,jquery里面本身就可以发送请求。

三. Axios 和 ajax 的区别 

1.两者各自的优缺点

axios的优点:

从浏览器中创建 XMLHttpRequest                          
支持 Promise API
从 node.js 创建 http 请求
转换请求和响应数据
自动转换JSON数据
axios的缺点:

ajax的优点:

               无刷新更新数据

    异步与服务器通信

    前端和后端负载平衡

    基于标准被广泛支持

    界面与应用分离

ajax的缺点:

          对搜索引擎不友好
         要实现Ajax下的前后退功能成本较大
         跨域问题限制

2..Axios 和 ajax 的区别 

axios是通过Promise实现对ajax技术的一种封装,就像jquery对ajax的封装一样,简单来说就是ajax技术实现了局部数据的刷新,axios实现了对ajax的封装,axios有的ajax都有,ajax有的axios不一定有,总结一句话就是axios是ajax,ajax不止axios。

注: 传统Ajax 指的是 XMLHttpRequest(XHR),
  axios和jQuer ajax都是对Ajax的封装、

自定义实例默认值
// 创建实例时配置默认值
const instance = axios.create({
  baseURL: 'https://api.example.com'
});
 
// 创建实例后修改默认值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
 在请求或响应被 then 或 catch 处理前拦截它们。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });
 
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么

  1. return Promise.reject(error);

  2. });

<think>我们正在处理一个关于Axios发送请求时出现"TypeError: Converting circular structure to JSON"的错误。这个错误通常发生在尝试将包含循环引用的对象转换为JSON字符串时。循环引用指的是对象属性之间形成了闭环,例如对象A引用了对象B,而对象B又引用了对象A,或者对象直接或间接地引用了自身。 根据提供的引用信息,我们可以总结以下几点: 1. 错误原因:尝试使用`JSON.stringify()`转换一个具有循环引用的对象(引用[3])。 2. 解决方案: a. 避免循环引用(引用[3])。 b. 使用try-catch捕获异常(引用[3])。 c. 使用第三方库如`circular-json`来处理循环引用(引用[4])。 d. 检查数据中是否存在循环引用并移除(引用[1]和[2])。 在Axios的上下文中,这个错误通常发生在我们将一个包含循环引用的JavaScript对象作为请求数据(data)发送时,因为Axios内部会尝试使用`JSON.stringify()`将数据转换为JSON字符串。 ### 解决方案步骤 1. **识别循环引用**: 首先,我们需要确定在发送的数据中哪里存在循环引用。我们可以使用一个函数来检测循环引用,或者使用第三方库来帮助识别。 2. **移除循环引用**: 一旦找到循环引用,我们可以修改数据结构,避免循环引用。例如,如果对象中有指向父对象的引用,我们可以将其删除或替换为其他不会引起循环的标识(如ID)。 3. **使用自定义序列化**: 我们可以使用`JSON.stringify()`的第二个参数(替换函数)来安全地序列化可能包含循环引用的对象。在替换函数中,我们可以检测到循环引用并返回一个可序列化的值(如`undefined`)或者一个占位符。 4. **使用第三方库**: 使用如`circular-json`(已过时,推荐使用`flatted`)或`cycle.js`(由Douglas Crockford提供)等库来处理循环引用。这些库可以将循环结构转换为线性结构,然后在解析时恢复。 5. **在Axios中处理**: 在Axios中,我们可以通过转换请求数据来避免循环引用。例如,在发送请求之前,使用上述方法处理数据。 ### 具体实现 #### 方法1:使用替换函数(replacer)移除循环引用 ```javascript function safeStringify(obj, indent = 2) { let cache = []; const retVal = JSON.stringify( obj, (key, value) => { if (typeof value === "object" && value !== null) { // 如果发现循环引用,则返回undefined,从而忽略该属性 if (cache.includes(value)) { return undefined; } cache.push(value); } return value; }, indent ); cache = null; // 释放内存 return retVal; } // 在Axios中使用 axios.post('/your-endpoint', JSON.parse(safeStringify(yourData)), { headers: { 'Content-Type': 'application/json' } }); ``` 注意:上面的方法会移除循环引用的属性,这可能会丢失一些数据。因此,我们需要根据实际需求调整。 #### 方法2:使用`flatted`库(替代circular-json) 安装: ```bash npm install flatted ``` 使用: ```javascript import { stringify, parse } from 'flatted'; // 将数据序列化为字符串 const dataString = stringify(yourDataWithCircularRef); // 在Axios中,我们通常不需要在发送前解析,因为服务器可能需要特殊处理才能解析这种格式 // 因此,如果服务器端没有使用相应的库解析,这种方法可能不适用 axios.post('/your-endpoint', dataString, { headers: { 'Content-Type': 'application/json' } }); ``` 但是请注意,使用`flatted`序列化后的字符串是一种特殊格式,服务器端也需要使用`flatted`库来解析。因此,这种方法需要前后端协作。 #### 方法3:使用`cycle.js`(由Douglas Crockford提供) `cycle.js`提供了`decycle`和`retrocycle`函数,可以在循环引用存在时进行序列化和恢复。 安装: ```bash npm install cycle ``` 使用: ```javascript import { decycle } from 'cycle'; // 在发送请求前处理数据 const dataWithoutCircular = decycle(yourData); // 然后使用JSON.stringify转换为字符串(因为decycle已经将循环引用转换为{$ref: ...}的形式) const dataString = JSON.stringify(dataWithoutCircular); axios.post('/your-endpoint', JSON.parse(dataString), { headers: { 'Content-Type': 'application/json' } }); ``` 在服务器端,如果需要恢复原始结构(包括循环引用),可以使用`retrocycle`。但通常,如果服务器端只需要数据而不需要恢复循环引用,则无需额外处理。 ### 在Axios拦截器中统一处理 如果我们想在多个请求中避免循环引用,可以在Axios的请求拦截器中统一处理数据: ```javascript import axios from 'axios'; import { decycle } from 'cycle'; // 或者使用自定义的safeStringify axios.interceptors.request.use(config => { // 只处理对象类型的data,如果是字符串或FormData等则不处理 if (config.data && typeof config.data === 'object') { // 使用decycle处理循环引用 config.data = JSON.parse(JSON.stringify(decycle(config.data))); // 或者使用自定义的safeStringify // config.data = JSON.parse(safeStringify(config.data)); } return config; }, error => { return Promise.reject(error); }); ``` ### 总结 解决Axios中"Converting circular structure to JSON"错误的关键在于处理发送数据中的循环引用。我们可以选择移除循环引用、使用替换函数忽略循环引用,或者使用第三方库来序列化循环结构。选择哪种方法取决于项目需求以及前后端的协作方式。 ### 相关问题 1. 如何检测JavaScript对象中的循环引用? 2. 除了Axios,还有哪些情况下会遇到“Converting circular structure to JSON”错误? 3. 在Node.js服务器端如何解析由`flatted`库序列化的数据? 4. 使用`cycle.js`的`decycle`函数处理后,数据格式会发生什么变化? 5. 在Axios中,除了请求数据,还有哪些地方可能导致循环引用错误?</think>### 解决 Axios 中的 "Converting circular structure to JSON" 错误 当使用 Axios 发送请求时遇到 `TypeError: Converting circular structure to JSON` 错误,根本原因是**请求数据中存在循环引用**。这通常发生在对象属性相互引用或嵌套对象引用父对象时。以下是完整解决方案: --- ### 错误原因分析 1. **循环引用**:对象 A 引用了对象 B,而对象 B 又引用了对象 A,形成闭环(如 DOM 节点、React/Vue 组件等)[^3] 2. **特殊对象类型**:包含不可序列化的对象(如函数、Promise、Socket 等)[^5] 3. **深层嵌套**:对象层级过深导致意外引用自身[^1] --- ### 解决方案 #### 方法 1:手动移除循环引用(推荐) ```javascript // 1. 检测并移除循环引用 function sanitizeData(data) { const seen = new WeakSet(); return JSON.parse(JSON.stringify(data, (key, value) => { if (typeof value === "object" && value !== null) { if (seen.has(value)) return "[Circular]"; // 标记循环引用 seen.add(value); } return value; })); } // 2. 在 Axios 请求中使用 axios.post('/api', sanitizeData(yourData)); ``` #### 方法 2:使用第三方库处理 ```bash npm install flatted # 替代过时的 circular-json ``` ```javascript import { stringify } from 'flatted'; axios.post('/api', JSON.parse(stringify(yourData)), { headers: { 'Content-Type': 'application/json' } }); ``` #### 方法 3:重构数据结构(根本解决) ```javascript // 转换前(有循环引用) const badData = { user: { name: "Alice" }, products: [ ... ] }; badData.user.self = badData; // 循环引用! // 转换后(使用引用ID代替直接引用) const goodData = { user: { name: "Alice", selfRef: "root" // 使用标识符代替直接引用 }, products: [ ... ] }; ``` #### 方法 4:错误捕获(临时方案) ```javascript try { await axios.post('/api', yourData); } catch (err) { if (err.message.includes('circular structure')) { console.error('检测到循环引用:', err); // 这里添加回退处理 } } ``` --- ### 关键检查点 1. **DOM 节点**:避免直接发送 DOM 元素或其引用 2. **类实例**:检查是否包含未实现 `toJSON()` 方法的类实例 3. **递归结构**:验证树形/嵌套结构中的父级引用 4. **第三方库对象**:特别是 Vue/React 组件、Socket 实例等[^4][^5] --- ### 调试技巧 1. 使用此函数检测循环引用: ```javascript function findCircularReferences(obj) { const seen = new WeakSet(); function detect(obj) { if (obj && typeof obj === 'object') { if (seen.has(obj)) return true; seen.add(obj); for (const key in obj) { if (detect(obj[key])) return true; } } return false; } return detect(obj); } ``` 2. 在 Chrome DevTools 中使用 `console.log(JSON.stringify(yourData))` 触发错误,控制台会高亮问题路径 --- ### 预防措施 ```javascript // Axios 全局拦截器(自动过滤问题数据) axios.interceptors.request.use(config => { if (config.data) { config.data = JSON.parse(JSON.stringify(config.data, (key, value) => { // 过滤函数和特殊对象 if (typeof value === 'function') return undefined; if (value instanceof Node) return '[DOM Node]'; return value; })); } return config; }); ``` > 提示:对于复杂应用,建议使用数据标准化库如 [normalizr](https://github.com/paularmstrong/normalizr) 管理嵌套关系[^1]。 --- ### 相关问题 1. **如何检测 JavaScript 对象中的循环引用?** 2. **Axios 请求中哪些数据类型最容易导致序列化错误?** 3. **处理循环引用时如何保留必要的数据关系?** 4. **在 Vue/React 应用中发送组件数据要注意什么?** 5. **JSON.stringify() 的 replacer 函数有哪些高级用法?** [^1]: 检测循环引用的自定义函数需要维护已访问对象集合 [^3]: 循环引用常见于包含父级引用的嵌套对象结构 [^4]: 第三方库如 `flatted` 可处理循环结构的序列化 [^5]: DOM 节点和运行时对象(如 Socket)不可序列化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值