当前位置:   article > 正文

Axios的全局配置实例和拦截器_vue axios全局配置

vue axios全局配置

Axios的全局配置实例和拦截器

1.常用的axios全局配置(这种方法对接口比较零散,不太好进行维护)

  • npm install axios
  • 在main.js中

import axios from ‘axios’
axios.defaults.baseURL = ‘http://localhost:3000’ (接口地址)
axios.defaults.timeout = 2000 //请求超时时间
Vue.prototype.$axios = axios //全局注册axios

  • 在页面/组件中使用
    onload{
    this.$axios.get(’/srp’)
    .then((data)=>{
    console.log(data)
    })
    }

2.Axios拦截器配置(大项目推荐)

vuecli3+新版配置

1.在package.json同目录下新建vue.config.js 文件

// 配置文件
const path = require('path');
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
const resolve = (dir) => path.join(__dirname, dir);
module.exports = {
    publicPath: process.env.NODE_ENV === 'production' ? '/site/vue-demo/' : '/', //公共路径
    indexPath: 'index.html', //相对于打包路径index.html路径
    outputDir: process.env.outputDir || 'dist', //'dist'生产环境构建文件的目录
    assetsDir: 'static', //相对于outputDir静态资源(js,css,fonts)目录
    lintOnSave: false, //是否开发环境下通过eslint-loader每次保存lint代码
    runtimeCompiler: true, //是否使用包含运行编译器的Vue构建版本
    productionSourceMap: !IS_PROD, //生产环境的source map
    parallel: require('os').cpus().length > 1, //是否Babel或TypeScript使用thread-loader,该选项在系统的CPU有多于一个内核自动启动,仅用于生产构建
    pwa: {}, //向PWA插件传递选项
    chainWebpack: config => {
        config.resolve.symlinks(true); //热更新失效
        // 如果使用多页面打包,使用vue inspect --plugins查看html是否在结果数组中
        config.plugin('html').tap(args => {
            // 修复 Lazy loading routes Error
            args[0].chunksSortMode = "none";
            return args;
        });
        config.resolve.alias //添加别名
            .set('@', resolve('src'))
            .set('@assets', resolve('src/assets'))
            .set('@components', resolve('src/components'))
            .set('@store', resolve('src/store'))
    },
    css: {
        extract: IS_PROD,
        requireModuleExtension: false, //去掉文件名中拿到.module
        loaderOptions: {
            //给less-loader传递less相关配置
            less: {
                //'globalVars'定义全局对象,可以加入全局变量
                globalVars: {
                    primary: '#333'
                }
            }
        }
    },
    devServer: {
        overlay: { //让浏览器overlay同时显示警告和错误
            warnings: true,
            errors: true
        },
        host: "localhost",
        port: 8080, //端口号
        https: false, //https:{type:Boolean}
        open: false, //配置后自动启动浏览器
        hotOnly: true, //热更新
        proxy: {
            //配置多个代理
            "/testIp": {
                target: "http://localhost:3000",
                changeOrigin: true,
                ws: true, //websocket支持
                secure: false,
                pathRewrite: {
                    "^/testIp": "/"
                }
            },
            "/elseIp": {
                target: "http://localhost:3000",
                changeOrigin: true,
                secure: false,
                pathRewrite: {
                    "^/elseIp": "/"
                }
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

2.封装axios实例 —— request.js

// request.js 拦截器
import axios from 'axios';

// 创建新的axios实例
const service = axios.create({
    baseURL: process.env.BASE_API, //这里使用了webpack中的全局变量process.env.BASE_API,而不是写死的ip,为了适应多个后台或开发时候aip地址和发布的时候api地址不一样的情况
    timeout: 3 * 1000
})

//请求拦截器
service.interceptors.request.use(config => {
    //发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
    config.data = JSON.stringify(config.data); //数据转化,也可以qs转换
    config.headers = {
            'Content-Type': 'application/x-www-form-urlencoded' //配置请求头
        }
        //注意使用token的使用需要引入cookie方法或者用本地localStorage等方法推荐js-cookie
        // const token = getCookie('名称');
        /** if (token) {
              config.params = { 'token': token } 
              //如果要求携带在参数中
              config.headers.token = token; 
              //如果要求携带在请求头中
          } */
    return config
}, error => {
    Promise.reject(error)
})

//响应拦截
service.interceptors.response.use(response => {
    //接收到响应数据并成功后的一些共有处理,关闭loading等
    return response
}, error => {
    //  接收到异常响应的处理开始
    if (error && error.response) {
        //1.公共错误处理
        //2,。根据响应码具体处理
        switch (error.response.status) {
            case 400:
                error.message = "错误请求"
                break;
            case 401:
                error.message = '未授权,请重新登录'
                break;
            case 403:
                error.message = '拒绝访问'
                break;
            case 404:
                error.message = '请求错误,没找到资源'
                window.location.href = "/NotFound"
                break;
            case 405:
                error.message = "请求方法未允许"
                break;
            case 408:
                error.message = '请求超时'
                break;
            case 500:
                error.message = '服务器端出错'
                break;
            case 501:
                error.message = '网络未实现'
                break;
            case 502:
                error.message = '网路错误'
                break;
            case 503:
                error.message = '服务不可用'
                break;
            case 504:
                error.message = '网络超时'
                break;
            case 505:
                error.message = 'http版本不支持该请求'
                break;
            default:
                error.message = `链接错误${error.response.status}`
        }
    } else {
        //超时处理
        if (JSON.stringify(error).includes('timeout')) {
            console.log('服务器响应超时,请刷新当前页')
        }
        error.message('连接服务器失败')
    }
    console.log(error.response)
    return Promise.resolve(error.response)
})

//导出文件

export default service
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

1、config.data = JSON.stringify(config.data);
2、config.headers = { ‘Content-Type’:‘application/x-www-form-urlencoded’ }
3、const token = getCookie(‘名称’)
4、if(token){
config.params = {‘token’:token} ;
config.headers.token= token;
}

上述的代码都是请求的配置项,非必须,也是分情况的,data/headers /params 这种本身的参数都有多种,和后台沟通,需要什么就配什么!
config.data = JSON.stringify(config.data);为什么不用qs.stringify,因为我的后台想要的只是json类型的传参,而qs转换会转换成为键值对拼接的字符串形式。当然你们后台需要传递字符串类型参数,那就换成qs或者其他格式方式。
const token = getCookie(‘名称’)这是token的取值,在取之前你肯定需要发请求拿到token,然后setCookie存起来,而名称就是你存的token的名称,每个人的不一样;
config.headers = { ‘Content-Type’:‘application/x-www-form-urlencoded’ }请求头内容的配置,也是不同的,application/x-www-form-urlencoded :form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式),你可以根据实际情况去配置自己需要的;

3、封装请求——http.js

/****   http.js   ****/
// 导入封装好的axios实例
import request from './request'

const http ={
    /**
     * methods: 请求
     * @param url 请求地址 
     * @param params 请求参数
     */
    get(url,params){
        const config = {
            method: 'get',
            url:url
        }
        if(params) config.params = params
        return request(config)
    },
    post(url,params){
        const config = {
            method: 'post',
            url:url
        }
        if(params) config.data = params
        return request(config)
    },
    put(url,params){
        const config = {
            method: 'put',
            url:url
        }
        if(params) config.params = params
        return request(config)
    },
    delete(url,params){
        const config = {
            method: 'delete',
            url:url
        }
        if(params) config.params = params
        return request(config)
    }
}
//导出
export default http
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

4、封装API

写法一:适合分类导出

import http from '../utils/http'
// 
/**
 *  @parms resquest 请求地址 例如:http://197.82.15.15:8088/request/...
 *  @param '/testIp'代表vue-cil中config,index.js中配置的代理
 */
let resquest = "/testIp/request/"

// get请求
export function getListAPI(params){
    return http.get(`${resquest}/getList.json`,params)
}
// post请求
export function postFormAPI(params){
    return http.post(`${resquest}/postForm.json`,params)
}
// put 请求
export function putSomeAPI(params){
    return http.put(`${resquest}/putSome.json`,params)
}
// delete 请求
export function deleteListAPI(params){
    return http.delete(`${resquest}/deleteList.json`,params)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

写法二:使用全部导出

import http from '../utils/http'
// 
/**
 *  @parms resquest 请求地址 例如:http://197.82.15.15:8088/request/...
 *  @param '/testIp'代表vue-cil中config,index.js中配置的代理
 */
let resquest = "/testIp/request/"

// get请求
export default{
 	getListAPI(params){
    	return http.get(`${resquest}/getList.json`,params)
	},
	 postFormAPI(params){
    	return http.post(`${resquest}/postForm.json`,params)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

5、在vue文件中调用

 import {getListAPI,postFormAPI, putSomeAPI, deleteListAPI} from '@/api/api'

  methods: {
      //promise调用,链式调用, getList()括号内只接受参数;
      //   get不传参
      getList() {
        getListAPI().then(res => console.log(res)).catch(err => console.log(err))
      },
		//post传参
      postForm(formData) {
        let data = formData
        postFormAPI(data).then(res => console.log(res)).catch(err => console.log(err))
      },

      //async await同步调用
      async postForm(formData) {
        const postRes = await postFormAPI(formData)
        const putRes = await putSomeAPI({data: 'putTest'})
        const deleteRes = await deleteListAPI(formData.name)
        // 数据处理
        console.log(postRes);
        console.log(putRes);
        console.log(deleteRes);
      },
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

方法二 :把api全部导入,然后用哪个调用哪个api——适用于全部导出

   import api from '@/api/api'
   methods: {
     getList() {
        api.getListAPI(data).then(res => {
          //数据处理
        }).catch(err => console.log(err))
      }
    }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结束:希望能帮到小伙伴,都是亲测有用的~ 但是这种封装方法的话,更适合大中型项目,配置比较合理,如果是自己小项目,就直接用axios就ok

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/299792
推荐阅读
相关标签
  

闽ICP备14008679号