Vue中封装axios

301 阅读3分钟

我正在参加「掘金·启航计划」

一、axios是什么

axios 是一个轻量的 HTTP,它是基于 XMLHttpRequest 服务来执行 HTTP 请求,支持 Promise,支持浏览器端和 Node.js 端。 axios 是现在开发 Vue 的首选。

特性

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

基本使用

安装

npm install axios --S

导入

import axios from 'axios'

发送请求

axios({        
  url:'xxx',   
  method:"get", 
  params:{     
    type: '',
    page: 1
  }
}).then(res => {  
  console.log(res);   
})

并发请求axios.all([])

function getUserAccount() {
    return axios.get('/user/12345');
}

function getUserPermissions() {
    return axios.get('/user/12345/permissions');
}

axios.all([getUserAccount(), getUserPermissions()])
    .then(axios.spread(function (res1, res2) { 
    // res1第一个请求的返回的内容,res2第二个请求返回的内容
    // 两个请求都执行完成才会执行
}));

二、axios的使用

举个例子

axios('http://', {
  method: 'GET',
  timeout: 1000,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
     Authorization: 'xxx',
  },
  transformRequest: [function (data, headers) {
    return data;
  }],
  // 其他请求配置...
})
.then((data) => {
  // 逻辑代码
  console.log(data);
}, (err) => {
  // 错误处理代码  
  if (err.response.status === 401) {
  // handle authorization error
  }
  if (err.response.status === 403) {
  // handle server forbidden error
  }
  // 其他错误处理.....
  console.log(err);
});

如果每个页面都发送类似的请求,都要写一堆的配置与错误处理,过于繁琐。 在项目中二次封装一下 axios 再使用。使得请求更简单,代码更简洁。

三、封装Axios

  • 请求头: 来实现一些具体的业务,必须携带一些参数才可以请求

  • 状态码: 根据接口返回的不同status , 来执行不同的业务

  • 请求方法:根据getpostBodypostPram等方法进行一个再次封装,使用起来更为方便

  • 请求拦截器: 根据请求的请求头设定,来决定哪些请求可以访问

  • 响应拦截器: 根据后端返回来的状态码执行不同业务

设置接口请求前缀

利用node环境变量来区分开发、测试和生产环境

if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL = 'http://'
} else if (process.env.NODE_ENV === 'production') {
  axios.defaults.baseURL = 'http://'
}

设置请求头与超时时间

const service = axios.create({
    timeout: 60000,  // 请求1分钟超时
    headers: {
        get: {
          'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
        },
        post: {
          'Content-Type': 'application/json;charset=utf-8'
       }
    },
})

封装请求

封装我们常用的get请求,postBody请求,postParam请求

// get 请求
export function get({
  url,
  params = {}
}) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params
    }).then((res) => {
      resolve(res.data)
    }).catch(err => {
     reject(err)
    })
  })
}

// postBody 请求
export function postBody({
  url,
  params = {}
}) {
  return new Promise((resolve, reject) => {
    axios.post(url, {
      params
    }).then((res) => {
      resolve(res.data)
    }).catch(err => {
      reject(err)
    })
  })
}

// postPamram请求
export function postParam({
  url,
  data = {},
  params = {}
}) {
  return new Promise((resolve, reject) => {
    axios({
      url,
      method: 'post',
      paramsSerializer: function (params) {
          return QS.stringify(params, { arrayFormat: 'brackets' });
      }
      // 发送的数据
      data,
      // url参数
      params
    }).then(res => {
      resolve(res.data)
    })
  })
}

在全局的main.js文件中注册方法

import {
  get,
  postBody,
  postParam,
} from "./utils/request.js";

Vue.prototype.$get = get;
Vue.prototype.$postBody = postBody;
Vue.prototype.$postParam = postParam;

页面直接调用

this.$get(getStuList, {}).then((res) => {
    console.log(res)
})

这样可以把api统一管理起来,以后维护修改只需要在api.js文件操作即可

请求拦截器

统一在请求拦截器里加上每个接口固定的信息,例如token

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 请求之前判断token是否存在
    token && (config.headers.Authorization = token)
    return config
  },
  error => {
    return Promise.error(error)
})

响应拦截器

响应拦截器可以在接口收到响应后先做一层过滤拦截再返回接口数据

// 响应拦截器
axios.interceptors.response.use(response => {
  // 状态码为200,接口请求成功
  if (response.status === 200) {
      return Promise.resolve(response)
  } else {
    return Promise.reject(response)
  }
}, error => {
  // 异常处理
  if (error.response.status) {
    return Promise.reject(error.response)
  }
})

总结

  • 简单的axios封装,就可以让我们的代码更加简洁高效
  • 根据自己的项目来封装适合项目的 axios