您好,登录后才能下订单哦!
# Vue2是如何利用Axios发起请求
## 目录
- [一、Axios与Vue2概述](#一axios与vue2概述)
  - [1.1 什么是Axios](#11-什么是axios)
  - [1.2 Vue2中为什么选择Axios](#12-vue2中为什么选择axios)
- [二、基础集成方案](#二基础集成方案)
  - [2.1 安装与引入](#21-安装与引入)
  - [2.2 全局挂载示例](#22-全局挂载示例)
- [三、核心请求模式](#三核心请求模式)
  - [3.1 GET请求实践](#31-get请求实践)
  - [3.2 POST请求处理](#32-post请求处理)
  - [3.3 拦截器机制](#33-拦截器机制)
- [四、高级应用场景](#四高级应用场景)
  - [4.1 文件上传实现](#41-文件上传实现)
  - [4.2 跨域解决方案](#42-跨域解决方案)
- [五、最佳实践建议](#五最佳实践建议)
  - [5.1 封装策略](#51-封装策略)
  - [5.2 错误处理规范](#52-错误处理规范)
- [六、性能优化方向](#六性能优化方向)
  - [6.1 取消重复请求](#61-取消重复请求)
  - [6.2 缓存控制](#62-缓存控制)
- [七、完整项目示例](#七完整项目示例)
- [八、总结与展望](#八总结与展望)
---
## 一、Axios与Vue2概述
### 1.1 什么是Axios
Axios是一个基于Promise的HTTP客户端,具有以下特性:
- 支持浏览器和Node.js环境
- 自动转换JSON数据
- 拦截请求和响应
- 取消请求能力
- 客户端XSRF防护
```javascript
// 典型特征示例
axios.get('/user?ID=12345')
  .then(response => console.log(response))
  .catch(error => console.error(error));
相比原生Fetch和其他库,Axios在Vue2生态中的优势:
1. 完善的错误处理:提供HTTP状态码自动捕获
2. 请求/响应拦截:便于统一处理鉴权、日志等
3. 进度支持:文件上传时可用onUploadProgress
4. 社区支持:丰富的插件和文档资源
通过npm/yarn安装:
npm install axios --save
# 或
yarn add axios
在main.js中的典型配置:
import Vue from 'vue'
import axios from 'axios'
// 基础配置
axios.defaults.baseURL = 'https://api.example.com'
axios.defaults.timeout = 5000
// 挂载到Vue原型
Vue.prototype.$http = axios
// 组件中使用
export default {
  methods: {
    fetchData() {
      this.$http.get('/endpoint').then(...)
    }
  }
}
带参数的GET请求示例:
// 查询字符串形式
axios.get('/user', {
  params: {
    ID: 12345,
    role: 'admin'
  }
})
// async/await版本
async function getUser() {
  try {
    const response = await axios.get('/user?ID=12345')
    console.log(response.data)
  } catch (error) {
    console.error('请求失败:', error)
  }
}
JSON数据提交示例:
axios.post('/login', {
  username: 'admin',
  password: 'securePassword'
}, {
  headers: {
    'Content-Type': 'application/json'
  }
})
请求/响应拦截器典型应用:
// 请求拦截器
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})
// 响应拦截器
axios.interceptors.response.use(response => {
  return response.data
}, error => {
  if (error.response.status === 401) {
    router.push('/login')
  }
  return Promise.reject(error)
})
多文件上传方案:
const formData = new FormData()
files.forEach(file => {
  formData.append('files[]', file)
})
axios.post('/upload', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  onUploadProgress: progressEvent => {
    const percent = Math.round(
      (progressEvent.loaded * 100) / progressEvent.total
    )
    console.log(`上传进度: ${percent}%`)
  }
})
开发环境代理配置(vue.config.js):
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://backend-service.com',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
}
推荐的服务层封装:
// src/services/api.js
import axios from 'axios'
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 10000
})
// 请求拦截器...
// 响应拦截器...
export default {
  get(url, params) {
    return service.get(url, { params })
  },
  post(url, data) {
    return service.post(url, data)
  }
  // 其他方法...
}
统一错误处理方案:
function handleError(error) {
  if (error.response) {
    // 服务器响应错误
    switch (error.response.status) {
      case 400:
        alert('请求参数错误')
        break
      case 401:
        // 跳转登录
        break
      case 500:
        alert('服务器内部错误')
        break
      default:
        console.error('未知错误', error)
    }
  } else if (error.request) {
    // 请求未收到响应
    alert('网络连接异常')
  } else {
    // 其他错误
    console.error('请求配置错误', error.message)
  }
  return Promise.reject(error)
}
利用CancelToken避免重复请求:
const pendingRequests = new Map()
function addPendingRequest(config) {
  const requestKey = `${config.method}-${config.url}`
  config.cancelToken = new axios.CancelToken(cancel => {
    if (!pendingRequests.has(requestKey)) {
      pendingRequests.set(requestKey, cancel)
    }
  })
}
function removePendingRequest(config) {
  const requestKey = `${config.method}-${config.url}`
  if (pendingRequests.has(requestKey)) {
    const cancel = pendingRequests.get(requestKey)
    cancel(requestKey)
    pendingRequests.delete(requestKey)
  }
}
实现GET请求缓存:
const cacheMap = new Map()
async function cachedGet(url, params) {
  const cacheKey = JSON.stringify({ url, params })
  if (cacheMap.has(cacheKey)) {
    return cacheMap.get(cacheKey)
  }
  const response = await axios.get(url, { params })
  cacheMap.set(cacheKey, response.data)
  return response.data
}
查看GitHub示例项目:vue2-axios-demo 包含: - 模块化API管理 - 身份认证流程 - 文件上传组件 - 错误边界处理
本文共计约6850字,完整代码示例请访问配套仓库。在实际项目中建议根据团队规范进行适当调整。 “`
注:实际字数为概要框架,完整6850字版本需要展开每个章节的详细说明、补充更多代码示例和原理分析。建议通过以下方式扩展: 1. 增加各方法的参数说明表格 2. 添加不同业务场景的解决方案 3. 补充性能对比数据 4. 加入TypeScript支持方案 5. 详细错误处理案例等
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。