# Axios

# 1.根据环境变量区分接口地址

不同的环境变量使用不同的接口前缀,开发环境、测试环境和生产环境

switch (process.env.NODE_ENV) {
    case "production": //生产环境
        axios.defaults.baseURL = "http://aka.cjzblog.top"
        break;
    case "test": //测试环境
        axios.defaults.baseURL = "http://192.168.10.12"
        break;
    default: //开发环境
        axios.defaults.baseURL = "http://192.168.10.12"
}

# 2.设置请求超时

/**
 * 设置超时时间和跨域是否允许携带凭证
 */
axios.defaults.timeout = 10000;
axios.defaults.withCredentials = true

# 3.设置请求头

其实这一步主要看后端想要啥样的数据,一般都是formdata,所以如下:

axios.defaults.headers['Content-Type'] = 'application/x-www-form-url-urlencoded';
axios.defaults.transformRequest = data => qs.stringify(data) //数据转换  这个时候qs就是转化数据用的

# 4.设置请求拦截器

我们封装这里的时候可以借鉴一下官方文档的例子,大致流程就是 客户端发起请求-->[请求拦截器]-->服务器

axios.interceptors.request.use(config => {
    //header头携带token
    let token = localStorage.getItem('token')
    token && (config.headers.Authorization = token)
    return config
}, error => {
    return Promise.reject(error)
});

这一步就是拿到存本地的token放到header头里传出去

这里说一下token,一般是在登录完成之后,将用户的token通过localStorage或者cookie存在本地,然后用户每次在进入页面的时候(即在main.js中),会首先从本地存储中读取token,如果token存在说明用户已经登陆过,则更新vuex中的token状态。 然后,在每次请求接口的时候,都会在请求的header中携带token,后台人员就可以根据你携带的token来判断你的登录是否过期,如果没有携带,则说明没有登录过。

这时候或许有些小伙伴会有疑问了,就是每个请求都携带token,那么要是一个页面不需要用户登录就可以访问的怎么办呢?其实,你前端的请求可以携带token,但是后台可以选择不接收啊!

如果要显得更规范一点可以在token前面加上"Bearer "

# 5.设置响应拦截器

这个跟请求拦截器差不多,只不过位置不同 服务端返回信息 ->[拦截的同意处理]->客户端js获取到信息

axios.interceptors.request.use(response => {
    return response.data //js直接取响应主体内容
}, error => {
    let { response } = error
    if (response) {
        //=>服务器有响应
        switch (response.status) {
            case 401: //泛指权限 用户需要登陆(一般未登录)
                break;
            case 403: //泛指token过期  服务器拒绝执行
                break;
            case 404: //找不到页面
                break;
        }
    } else {
        //=>服务器没有结果返回,判断问题
        if (!window.navigator.onLine) {
            //断网处理:可以跳转到跳转到断网页面
            return
        }
        return Promise.reject(error);
    }
});

在这些错误处理中,需要用什么提示或者处理还得看项目需求,如果需要用elementUI的错误提示,直接引入vue,这样就OK了,做到了全局错误处理,断网处理

Vue.prototype.$message.error({
            type: "error",
            message: response.data.message
        })
上次更新: 2021/5/28上午10:07:15