axios的插件来调用API,vue中用axios请求接口,处理网络失败和网络超时问题,axios拦截器。axios开发说明里边提到的栏截器(axios.Interceptors)应该是这种机制,降低代码耦合度,提高程序的可重用性,同时提高了开发的效率。
安装
安装axios和vue-axios,vue-axios是将axios集成到Vue.js的小包装器。方便我们使用。
axios安装

npm install axios;

在mian.js中引用axios,并邦到原型链上。使用插件的时候,一般要在入口文件main.js中引入,因为mian.js是项目首先运行的文件:

import Vue from 'vue'
import axios from ‘axios’
//一般不这么使用
Vue.prototype.$http = axios

安装vue-axios

npm install --save axios vue-axios

在mian.js中引用axios,vue-axios,通过全局方法 Vue.use() 使用插件,就相当于调用install方法:

import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)

一般会使用 vue-axios 的插件写法,更符合 Vue 整体生态环境,直接写原型链,感觉有些粗暴了,除非是很底层的实现,否则不太推荐这样写了。

一、axios的封装
在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御cSRF等。所以我们的尤大大也是果断放弃了对其官方库vue-resource的维护,直接推荐我们使用axios库。

1、在https.js文件引入

import axios from 'axios'

2、环境切换
项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来匹配我们的默认的接口url前缀。axios.defaults.baseURL可以设置axios的默认请求地址。

// 环境的切换
if (process.env.NODE_ENV == 'development') {    
    axios.defaults.baseURL = 'https://www.baidu.com';} 
else if (process.env.NODE_ENV == 'debug') {    
    axios.defaults.baseURL = 'https://www.ceshi.com';
} 
else if (process.env.NODE_ENV == 'production') {    
    axios.defaults.baseURL = 'https://www.production.com';
}

3、设置请求超时
通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新等。
//设置访问超时时间

axios.defaults.timeout = 10000;

4、post请求头的设置
post请求的时候,我们需要加上一个请求头,所以可以在这里进行一个默认的设置,即设置post的请求头为application/x-www-form-urlencoded;charset=UTF-8

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

5、请求拦截
我们在发送请求前可以进行一个请求的拦截,为什么要拦截呢,我们拦截请求是用来做什么的呢?比如,有些请求是需要用户登录之后才能访问的,或者post请求的时候,我们需要序列化我们提交的数据。这时候,我们可以在请求被发送之前进行一个拦截,从而进行我们想要的操作。
// HTTPresponse拦截,响应拦截
axios.interceptors.response.use(res => {

//相应回的auth-token
    sessionStorage.setItem('xAuthToken', res.headers['x-auth-token'])
    const status = res.data.code || 200
    // const statusWhiteList = website.statusWhiteList || [];
    const message = res.data.msg || '未知错误';
    //如果在白名单里则自行catch逻辑处理
    // if (statusWhiteList.includes(status)) return Promise.reject(res);
    //如果是401则跳转到登录页面
    // if (status === 401) store.dispatch('FedLogOut').then(() => router.push({path: '/login'}));
    // 如果请求为非200否者默认统一处理
    if (status !== 200) {
        Message({
            message: message,
            type: 'error'
        })
        return Promise.reject(new Error(message))
    }
    return res;
}, error => {
    // LoadingStart.close()
    return Promise.reject(new Error(error));
})

6、封装get方法和post方法等请求
新建一个api.js

import request from "./https";

const api = {
    // 预留的公共接口
}
export default api;

export function get(url, parameter) {
    return request({
        url: url,
        method: 'get',
        params: parameter
    })
};

export function post(url, parameter) {
    return request({
        url: url,
        method: "post",
        params: parameter
    })
};

// post method= {post | put | get| delete}
export function httpAction(url, parameter, method, contentType) {
    debugger
    return request({
        url: url,
        method: method,
        data: parameter,
        header: {
            //常用 "application/json" "application/x-www-form-urlencoded"
            "Content-Type": contentType

        }
    })
};

//put
export function putAction(url, parameter) {
    return request({
        url: url,
        method: 'put',
        data: parameter
    })
};

//deleteAction
export function deleteAction(url, parameter) {
    return request({
        url: url,
        method: 'delete',
        params: parameter
    })
}

// 获取pdf二进制文件流
export function postPdf(url, data) {
    return request({
        url: url,
        method: 'post',
        data: data,
        header: {
            //常用 "application/json" "application/x-www-form-urlencoded"
            "Content-Type": 'application/json;charset=utf-8'
        },
        responseType: 'blob' //arraybuffer/blob//加上格式,二进制
    })
}