IT评测·应用市场-qidao123.com

标题: 一文把握Axios [打印本页]

作者: 瑞星    时间: 2025-2-13 16:14
标题: 一文把握Axios
本文转载自:https://fangcaicoding.cn/course/12/68
    大家好!我是方才,目前是8人后端研发团队的负责人,拥有6年后端经验&3年团队管理经验
  系统学习践行者!近期在系统化输出前端入门相关技能文章,期望能帮大家构建一个完备的知识体系。
  如果对你有所资助,记得一键三连!
  我创建了一个编程学习交换群(扫码关注后即可加入),秉持“一群人可以走得更远”的理念,期待与你一起 From Zero To Hero!
  茫茫人海,遇见即是缘分!方才兄送你ElasticSearch系列知识图谱、前端入门系列知识图谱、系统架构师备考资料!
  一文把握Axios

   ps:学习 Axios需要相识最基本的HTTP知识,至少需要知晓GET/POST/PUT/DELETE等方法的基本使用;同时也需要相识json的基本知识,知晓json数据的基本格式。
  能解决的问题

你写了一个很棒的**前端项目,一切顺遂运行,直到你需要和后端举行数据交互时。**此时,前端的页面和后端的服务器就像是两个相隔千里的邻居,相互之间的沟通仿佛隔着一道厚墙。你想要的数据哀求和响应总是有点“卡壳”,问题重重。这时,Axios 就成了你解决问题的利器。是不是内心在想,怎么就这么巧,今天的文章正好讲这个?
今天,我们就来一起探索如何用 Axios 轻松搞定前端与后端的数据交互,且从此告别“数据哀求卡壳”的困扰。
在本篇文章中,我们将系统地先容 Axios,让你全面相识它的焦点概念、基本用法及高级本领。你将学到如何发送 GET 哀求、POST 哀求、处理哀求和响应拦截器、处理错误等。最紧张的是,我们将通过一系列简单易懂的示例,让你快速把握如何将 Axios 与 Vue框架联合使用,实现高效的数据哀求和处理。

什么是 Axios?

Axios 是一个基于 Promise 的 HTTP 库,主要用于浏览器和 Node.js 中发送 HTTP 哀求。你可以用它发送各种范例的哀求(如 GET、POST、PUT、DELETE 等),并且可以或许轻松地处理哀求和响应的数据。简单来说,它让前端和后端的“对话”变得简单且流畅。
安装 Axios

起首,打开你的项目终端,使用 npm 或 yarn 安装 Axios:
  1. npm install axios
  2. # 或者
  3. yarn add axios
复制代码
安装完成后,你就可以在vue项目中引入并使用 Axios 了。
哀求示例

发送一个 GET 哀求

让我们先来看一个简单的 GET 哀求示例。假设我们需要获取一个用户列表:
  1. import axios from 'axios';
  2. axios.get('https://api.example.com/users')
  3.   .then(response => {
  4.     console.log('用户列表:', response.data);
  5.   })
  6.   .catch(error => {
  7.     console.error('请求出错:', error);
  8.   });
复制代码
这里的 get 方法发出了一个 GET 哀求,访问 https://api.example.com/users,然后通过 .then() 获取成功的响应数据,通过 .catch() 处理哀求错误。
发送一个 POST 哀求

接下来,我们来发送一个 POST 哀求,提交一个新的用户数据:
  1. import axios from 'axios';
  2. const newUser = {
  3.   name: '方才兄',
  4.   age: 30,
  5. };
  6. axios.post('https://api.example.com/users', newUser)
  7.   .then(response => {
  8.     console.log('创建成功:', response.data);
  9.   })
  10.   .catch(error => {
  11.     console.error('创建失败:', error);
  12.   });
复制代码
在这里,我们通过 axios.post 发送了一个包含新用户数据的哀求。如果哀求成功,控制台会打印出响应数据;如果失败,控制台会打印出错误信息。
哀求和响应拦截器

有时候,我们需要对哀求和响应做一些统一的处理,比如添加哀求头、统一处理错误等。Axios 提供了哀求拦截器和响应拦截器来资助我们做这些事情。
哀求拦截器

哀求拦截器通常用来修改哀求,比方添加认证 token、设置自界说哀求头等:
  1. axios.interceptors.request.use(config => {
  2.   // 在请求发送之前做些什么
  3.   config.headers['Authorization'] = 'Bearer your-token';
  4.   return config;
  5. }, error => {
  6.   // 对请求错误做些什么
  7.   return Promise.reject(error);
  8. });
复制代码
响应拦截器

响应拦截器通常用来处理响应数据或错误,比方统一处理错误信息:
  1. axios.interceptors.response.use(response => {
  2.   // 对响应数据做些什么
  3.   return response;
  4. }, error => {
  5.   // 对响应错误做些什么
  6.   console.error('响应错误:', error.response.data);
  7.   return Promise.reject(error);
  8. });
复制代码
错误处理

在现实开发中,网络哀求总是不可制止地会遇到各种错误。比方,服务器错误、网络断开、哀求超时等。Axios 为我们提供了机动的错误处理机制。
  1. axios.get('https://api.example.com/users')
  2.   .then(response => {
  3.     console.log('用户列表:', response.data);
  4.   })
  5.   .catch(error => {
  6.     if (error.response) {
  7.       // 服务器响应错误
  8.       console.error('响应错误:', error.response.data);
  9.     } else if (error.request) {
  10.       // 请求未发送
  11.       console.error('请求未发送:', error.request);
  12.     } else {
  13.       // 其他错误
  14.       console.error('其他错误:', error.message);
  15.     }
  16.   });
复制代码
通过判定 error.response、error.request 和 error.message,我们可以更精致地捕获和处理差别范例的错误。
vue中的工具类封装

我们在vue项目中,通常会统一封装工具类,更加方便在其他文件中的使用。
封装axiosInst.js

  1. import axios from 'axios';
  2. // 创建一个Axios实例
  3. const axiosInst = axios.create({
  4.     baseURL: import.meta.env.VITE_API_URL+import.meta.env.VITE_API_PATH, //.env中的VITE_APP_API参数
  5.     timeout: 1000, // 请求超时时间(毫秒)
  6.     headers: {
  7.         'Content-Type': 'application/json', // 设置默认的Content-Type
  8.     },
  9. });
  10. // 封装 GET 请求
  11. const get = (url, params = {}, config = {}) => {
  12.     return axiosInst.get(url, {
  13.         params,
  14.         ...config,
  15.     });
  16. };
  17. // 封装 POST 请求
  18. const post = (url, data = {}, config = {}) => {
  19.     return axiosInst.post(url, data, config);
  20. };
  21. // 封装 PUT 请求
  22. const put = (url, data = {}, config = {}) => {
  23.     return axiosInst.put(url, data, config);
  24. };
  25. // 封装 DELETE 请求
  26. const del = (url, params = {}, config = {}) => {
  27.     return axiosInst.delete(url, {
  28.         params,
  29.         ...config,
  30.     });
  31. };
  32. // 请求拦截器
  33. axiosInst.interceptors.request.use(
  34.     (config) => {
  35.         console.debug("interceptors.request start!")
  36.         // 在发送请求之前做些什么,比如给请求头添加Token
  37.         const token = localStorage.getItem('token'); // 从本地存储中获取token
  38.         if (token) {
  39.             config.headers['Authorization'] = `Bearer ${token}`;
  40.         }
  41.         return config;
  42.     },
  43.     (error) => {
  44.         // 处理请求错误
  45.         return Promise.reject(error);
  46.     }
  47. );
  48. // 响应拦截器
  49. axiosInst.interceptors.response.use(
  50.     (response) => {
  51.         console.debug("interceptors.response start!")
  52.         // 统一处理响应数据,例如解析响应结构
  53.         if (response.data.code === 200) {
  54.             return response.data.data;
  55.         } else {
  56.             // 可以根据具体的业务需求处理非200的情况
  57.             return Promise.reject(response.data.message);
  58.         }
  59.     },
  60.     (error) => {
  61.         // 统一处理响应错误
  62.         let message = '';
  63.         if (error.response) {
  64.             // 请求已经发出,但是服务器响应一个状态码非 2xx 的范围
  65.             switch (error.response.status) {
  66.                 case 400:
  67.                     message = '请求错误';
  68.                     break;
  69.                 case 401:
  70.                     message = '未授权,请重新登录';
  71.                     break;
  72.                 case 403:
  73.                     message = '拒绝访问';
  74.                     break;
  75.                 case 404:
  76.                     message = '请求地址出错';
  77.                     break;
  78.                 case 500:
  79.                     message = '服务器内部错误';
  80.                     break;
  81.                 default:
  82.                     message = `连接错误 ${error.response.status}`;
  83.             }
  84.         } else {
  85.             // 处理断网的情况
  86.             if (!window.navigator.onLine) {
  87.                 message = '网络已断开';
  88.             } else {
  89.                 message = '请求失败,请稍后重试';
  90.             }
  91.         }
  92.         // 可以在这里显示错误提示信息
  93.         console.error(message);
  94.         return Promise.reject(error);
  95.     }
  96. );
  97. export default {
  98.     axiosInst,
  99.     get,
  100.     post,
  101.     put,
  102.     del,
  103. };
复制代码
在vue中使用


  1. import axiosInst from "./axiosInst.js";
  2. /**
  3. * 增删改查
  4. */
  5. const pagePublicArticle = (pageReq = {}) => {
  6.     return axiosInst.post("/article/public/page", pageReq);
  7. }
  8. const getArticle = (id) => {
  9.     return axiosInst.get("/article/" + id);
  10. }
  11. const addArticle = (articleSaveReq = {}) => {
  12.     return axiosInst.post("/article", articleSaveReq);
  13. }
  14. const editArticle = (articleSaveReq = {}) => {
  15.     return axiosInst.put("/article", articleSaveReq);
  16. }
  17. const deleteArticle = (id) => {
  18.     return axiosInst.del("/article/" + id);
  19. }
  20. export default {
  21.     pageArticle,
  22.     getArticle,
  23.     addArticle,
  24.     editArticle,
  25.     deleteArticle
  26. }
复制代码

  1. <script setup>
  2. // 查询结果的容器
  3. const searchResults = ref([]);
  4.    
  5. const performSearch = async () => {
  6.   const trimmedQuery = searchStr.value.trim();
  7.   if (!trimmedQuery) {
  8.     searchResults.value = [];
  9.     return;
  10.   }
  11. // 调用后端api,获取查询结果
  12.   const pagePublicArticle = await articleApi.pagePublicArticle({
  13.     page: 1,
  14.     pageSize: 50,
  15.     title: trimmedQuery
  16.   });
  17. // 将接口的响应报文赋值给容器
  18.   searchResults.value = pagePublicArticle.records;
  19. };
  20. </script>
复制代码


axios 和 Promise对比

axios 和 Promise 是两个差别层面的工具。Promise 是 JavaScript 内置的用于处理异步操作的对象,而 axios 是一个基于 Promise 的 HTTP 客户端库。它可以资助我们更简单、更便捷地发送 HTTP 哀求,并主动管理返回的 Promise 对象。接下来,我们详细对比 Promise 和 axios 的特点与用法。
axios 和 Promise 的关系
axios 是基于 Promise 实现的,也就是说 axios 哀求返回的是一个 Promise 对象。axios 封装了 XMLHttpRequest,可以或许简化处理 HTTP 哀求,淘汰手动处理 Promise 相关逻辑的繁琐代码。
Promise 和 axios 的主要区别
功能Promiseaxios作用管理异步操作基于 Promise 封装的 HTTP 哀求库使用场景任何异步逻辑(如文件读取、定时器等)主要用于发送 HTTP 哀求,常见于 API 调用返回值提供 then、catch、finally 方法返回一个 Promise,可以直接调用这些方法异常处理通过 catch 方法捕获内置错误拦截器,可根据 HTTP 状态码处理差别错误扩展性需要手动封装,机动性高内置多种配置项,如哀求头、超时时间、拦截器等 Promise 的使用示例
如果不使用 axios,而是手动用 fetch 或其他 API 发起哀求,代码大概会略显复杂。以下是一个使用 Promise 的 HTTP 哀求示例:
  1. // 使用 fetch 和 Promise
  2. function getUserData(userId) {
  3.   return fetch(`https://jsonplaceholder.typicode.com/users/${userId}`)
  4.     .then((response) => {
  5.       if (!response.ok) {
  6.         throw new Error(`HTTP error! status: ${response.status}`);
  7.       }
  8.       return response.json();
  9.     })
  10.     .then((data) => {
  11.       console.log(data); // 成功时的数据
  12.       return data;
  13.     })
  14.     .catch((error) => {
  15.       console.error("请求失败:", error.message); // 捕获错误
  16.     });
  17. }
  18. getUserData(1);
复制代码
在这个例子中,我们用 fetch 发起哀求,返回的也是一个 Promise,并通过 .then() 和 .catch() 来处理成功和失败的环境。
axios 的主要功能与优势
主动解析响应数据:axios 会主动解析 JSON 响应,而使用 fetch 需要手动调用 response.json()。
哀求/响应拦截器:可以在哀求发送前或响应接收后举行统一处理。比方,添加认证头或错误处理。
  1. axios.interceptors.request.use(
  2.   (config) => {
  3.     config.headers.Authorization = "Bearer token";
  4.     return config;
  5.   },
  6.   (error) => Promise.reject(error)
  7. );
复制代码
取消哀求:axios 支持取消哀求,尤其在复杂的应用中(如 React、Vue 项目),制止不须要的哀求。 更好的错误处理:axios 能根据差别的 HTTP 状态码主动分类错误,使得错误处理更清晰。
配置方便:可以在实例化 axios 时设置默认配置,比方基 URL、超时时间、头信息等。
哀求数据格式化:主动将哀求参数格式化为查询字符串,或在 POST 哀求时主动序列化 JSON 数据。
总结

axios 让基于 Promise 的 HTTP 哀求更强大和便捷,在现实开发中黑白常常用的选择。如果项目中大量依靠 API 哀求,axios 可以大大简化代码,提高开发效率。
总结扩展

在本文中,我们已经全面先容了 Axios 的基本使用,包括如何发送哀求、处理响应、配置拦截器、处理错误等。通过本篇教程,你应该可以或许轻松把握 Axios,并将它应用于自己的项目中。
接下来,你可以进一步深入学习 Axios 的更多高级特性,比如取消哀求、并行哀求、哀求超时控制等。Axios 是一个非常强大的工具,它可以或许资助你轻松应对前端与后端之间的数据交互。
记着,编程之路不止一步,方才兄始终伴随着你,带你一起走得更远。希望你能在使用 Axios 时游刃有余,处理数据哀求时如鱼得水,冲破那道厚厚的“隔墙”!

希望今天的分享对你有所资助!别忘了,前端之路,方才兄与你偕行!—
近期更新筹划

   近期更新筹划(有需要的小同伴,记得点赞关注哟!)
    “学编程,肯定要系统化”——若你也是系统学习的践行者,记得点赞关注,期待与你一起 From Zero To Hero!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4