vue项目封装axios

本文介绍了在Vue项目中,由于官方推荐使用axios代替vue-resource,作者分享了如何封装axios以实现统一的请求拦截和错误处理。通过展示src/api目录结构、apiUrl.js、apiUtil.js和index.js的代码,说明了如何将apiUrl.js的请求配置转化为可调用的方法,并在sendApiInstance中设置axios拦截器。最后展示了在页面中如何调用这些封装好的请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  还是直奔主题吧,因为官方不推荐使用vue-resource,而是推荐axios,所以这篇文章分享给大家我在自己的项目里如何封装axios,虽说将axios在main.js里写入Vue的原型链作为Vue的属性(Vue.prototype.$http = axios),直接用最原始的方法也能进行请求

this.$http.get('/user',{
  params:{
    ID:12345
  }
})
.then(function(response){
  console.log(response);
})
.catch(function(err){
  console.log(err);
});

  这样也不是说不可以,但是真的在开发工作中,因为要统一设置请求的拦截,错误的处理,所以封装axios是十分必要的。
  首先这是我src下api的目录
这里写图片描述

  这是apiUrl.js,将我们的请求名称和url以及方法放在这里

export default {
  login_in: { url: '/login', method: 'get' },
  getUserList: { url: '/user/list', method: 'get' }
}

  重点在于我们的apiUtil.js

import axios from 'axios'
import { Toast } from 'mint-ui'

const generateApiMap = (map) => {
  let facade = {}
  _.forEach(map, function (value, key) {
    facade[key] = toMethod(value)
  })
  return facade
}

const toMethod = (options) => {
  options.method = options.method || 'post'
  return (params = {}, attachedParams, config = {}) => {
    params = _.extend(params, attachedParams)
    return sendApiInstance(options.method, options.url, params, config)
  }
}

// 创建axios实例
const createApiInstance = (config = {}) => {
  const _config = {
    withCredentials: true, // 跨域
    baseURL: ''
  }
  config = _.merge(_config, config)
  return axios.create(config)
}

const err_check = (code, message, data) => {
  if (code ==200){
    return true
  }
  return false
}

const sendApiInstance = (method, url, params, config = {}) => {
  if(!url){
    return
  }
  let instance = createApiInstance(config)

  instance.interceptors.response.use(response => {
    let {code, message, data} = response.data
    if (err_check(code, message, data) && data) {
      return Promise.resolve(data)
    } else {
      return Promise.reject(data)
    }
  },
  error => {
    Toast({
      message: error.response || error.message,
      duration: 3000
    })
    return Promise.reject(error).catch(res => {
        console.log(res)
      })
  }
  )
  if (method === 'get') {
    params = {
      params: params
    }
  }

  return instance[method](url, params, config)
}

export default {
  generateApiMap
}

  紧接着是index.js

import apiUrl from './apiUri'
import apiUtil from './apiUtil'

const generateApiMap = apiUtil.generateApiMap({...apiUrl})
export default {
  ...generateApiMap // 取出所有可遍历属性赋值在新的对象上
}

  可以看出来整体的想法就是在apiUrl.js里面只放请求名称以及url和请求方法,然后再apiUtil.js里面去将其转换为相应的方法,首先是在index.js里面调用generateApiMap,遍历我们的apiUrl将其中每个对象转换为方法,也就是toMethod要做的事,紧接着在sendApiInstance里去创建我们的axios实例,并设置拦截器(我只做了返回拦截),到return instance[method](url, params, config)这一步也就将我们的请求封装成功,下面是在页面调用的时候
这里写图片描述

  封装axios的方式有很多种,每个人的代码习惯也不一样,此处也只是给大家一个参考

### Vue.js 项目Axios封装示例 #### 创建 Axios 实例并设置默认参数 为了提高代码的可维护性和灵活性,在 `src/utils` 文件夹下创建一个新的 JavaScript 文件命名为 `http.js` 或者 `axiosInstance.js`。 ```javascript // src/utils/axiosInstance.js import axios from 'axios'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 设置基础url,可以在 .env 文件里定义环境变量 timeout: 5000 // 请求超时时间 }); export default service; ``` 此部分配置了 Axios 的实例,并设置了全局的基础 URL 和请求超时的时间[^1]。 #### 添加请求拦截器和响应拦截器 继续在同一文件内添加请求与响应拦截器来处理通用逻辑: ```javascript service.interceptors.request.use( config => { // 在发送请求之前做些什么 return config; }, error => { // 对请求错误做些什么 return Promise.reject(error); } ); service.interceptors.response.use( response => { const res = response.data; // 如果返回的状态码不是2xx,则认为是有错的 if (res.code !== 200) { Message({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 }); return Promise.reject(new Error(res.message || 'Error')); } else { return res; } }, error => { // 对响应错误做点什么 return Promise.reject(error); } ); ``` 这段代码实现了对所有发出请求前后的统一处理机制,比如可以在此处加入 token 验证等功能[^3]。 #### 定义 API 接口函数 接下来在 `src/api` 下建立相应的模块化接口调用方法。例如对于用户认证功能来说,可在该路径下新增名为 `auth.js` 的文件用于管理登录注册等相关操作。 ```javascript // src/api/auth.js import request from '@/utils/axiosInstance'; export function login(data) { return request({ url: '/login', method: 'post', data }) } ``` 这里通过引入前面创建好的 Axios 实例来进行具体的 HTTP 调用,并将其导出以便其他组件能够方便地使用这些预设的方法[^4]。 #### 注册到 Vue 原型链上或作为插件提供给整个应用访问 最后一步是在项目的入口文件 `main.js` 中完成初始化工作,使得任何地方都可以轻松获取上述自定义的服务对象。 ```javascript // main.js import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; import store from './store'; import http from './utils/axiosInstance'; const app = createApp(App).use(store).use(router); app.config.globalProperties.$http = http; new app.mount('#app'); ``` 这样做的好处是可以让所有的子组件都能够直接通过 this 来获得 `$http` 属性从而发起网络请求而无需重复导入相同的依赖项[^2]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值