美文网首页
模块化详细 封装 axios 请求(手撸)

模块化详细 封装 axios 请求(手撸)

作者: 江南永保春 | 来源:发表于2021-05-23 16:49 被阅读0次

    自己封装的模块化 axios 请求,详细


    新增 http.js 文件用于封装 axios

    Import axios from ‘axios’

    Import qs from ‘qs’

    // 根据以下定义的基础地址 方便项目调试

    switch (process.env.NODE_ENV) {

        case "production":

            axios.defaults.baseURL = 'http://127.0.0.1:8090'

            break;

        case "test":

            axios.defaults.baseURL = 'http://127.0.0.2:8080'

            break;

        default:

            axios.defaults.baseURL = 'http://jsonplaceholder.typicode.com/'// 默认运行地址

    }

    //超时时间

    axios.defaults.timeout = 10000;

    //跨域是否允许携带凭证

    axios.defaults.withCredentials = true;

    设置请求传递数据的格式(主要看服务器要求什么格式,我们处理后给服务器)

    axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'

     //告知服务器请求主体的数据格式xxx=xxx&xxx=xxx 只对 post请求有作用 

    //transformRequest 用于改变post请求

    axios.defaults.transformRequest = data => qs.stringify(data) 

    /* 

    请求拦截器 比如你妈妈给你100块钱嘱咐你到我这买东西 你可以买也可以不买 也可以只买不到100块钱的东西  想干什么 就干什么 为所欲为 一般我用的比较少

    网络请求都会先走这个方法 在里面能为请求头加一些自定义的内容发送给服务器 比如:Token校验啥的

    */

    axios.interceptors.request.use(config => {

        let token = localStorage.getItem('token') // 比如获取本地的token 然后 把 token 给请求头

        token && (config.headers.Authorization = token)

        return config

    }, error => {

        return Promise.reject(error)

    })

    /* 

    响应拦截器 服务器收到请求了 比如 你给我100 块钱了 我给你找零给你东西,但是我也可以不给你东西 还把你打一顿

    */

    还有很多返回值 去axios 文档上看 

    axios.interceptors.response.use(res => {

        return res.data

    }, error => {

        let { res } = error

        if (res) {

    //如果服务器返回的有结果 根据公司需求来写

            switch (res.status) {

                case 401://当前请求需要用户验证(一般是没有登录) 做一些提示

                    console.log('需要验证 msg 提示窗口什么的 跳转登录页什么的');

                    break;

                case 403://服务器收到请求,但是拒绝执行(一般是令牌过期)

                       console.log('清除令牌什么的');

                    break;

                case 404: // 你可以写个页面啥的专门用来提示 404

                    break;

            }

        } else {

            //服务器返回的没有结果 1:服务器炸了 2:本地没有网络,这里做一下断网处理

            if (!window.navigator.onLine) {

    // 断网处理: 你可以像404那样新只能一个页面 然后你懂的.....

                return

            }

    //如果断网也没有 就是服务器的问题了 返回服务器报错信息

            return Promise.reject(error)

        }

    })

    //配置好后 把封装好的axios暴露出去 供外部使用

    export default axios;


    Package.json文件


      "scripts": {

        "serve": "vue-cli-service serve",

        "serve:test": "set NODE_ENV=test&&vue-cli-service serve",

        "serve:production": "set NODE_ENV=production&&vue-cli-service serve",

      },

    运行:

    npm run serve:test

    npm run serve:production

    nnpm run serve


    使用:


    新增放置登录接口的页面:


    新增LoginApi.js

    import axios from './http'

    function login(params) {

        return axios.get('login', params)

    }

    export default {

        login

    }


    新增放置所有API的页面:


    //定义所有数据请求

    import LoginApi from './LoginApi’

    export default {

        LoginApi

    }


    将定义所有数据请求的JS文件挂载到vue全局对象上


    import api from './utils/api'

    vue.prototype.$api = api

    页面中使用

    this.$api.LoginApi.login(参数).then(res=>{})


    总之要求是这样写的 这还是挺low的一种,按规范化来做吧。。

    相关文章

      网友评论

          本文标题:模块化详细 封装 axios 请求(手撸)

          本文链接:https://www.haomeiwen.com/subject/aorzjltx.html