Vue axios 封装

1.为什么一定要封装呢不是直接向ajax一样直接使用呢, 原因如下

1.每家公司都会去云服务器注册他们自己的域名这里不管是一级域名还是二级域名,axios提供的请求拦截器再加上我们项目的环境变量可灵活多变的在所有请求上面加上公司 的域名简直不要太爽哦。

2.如果你们接手过项目很多什么c端b端。后台接口respons返回的难道你要一个个处理吗。当时不是,所有接口请求成功之前都要过你这个拦截器,axios为我们提供了响应 拦截器。异常统一处理,只需要判断HTTP状态码即可。一个字爽

3.封装请求方法get post, put, delte。为你打开方便大门配合async 和await

 // 在http.js中引入axios
import axios from 'axios'; // 引入axios
import QS from 'qs'; // 引入qs模块,用来序列化post类型的数据,后面会提到
// vant的toast提示框组件,大家可根据自己的ui组件更改。
import { Toast } from 'vant';
axios.defaults.timeout = 10000;  //通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新等。
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //设置post请求头
// 先导入vuex,因为我们要使用到里面的状态对象
// vuex的路径根据自己的路径去写
import store from '@/store/index';
// 请求拦截器
axios.interceptors.request.use(   
    config => {       

        // 每次发送请求之前判断vuex中是否存在token       

        // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况

        // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断

        const token = store.state.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);       

        }   

    },   

    // 服务器状态码不是2开头的的情况

    // 这里可以跟你们的后台开发人员协商好统一的错误状态码   

    // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等

    // 下面列举几个常见的操作,其他需求可自行扩展

    error => {           

        if (error.response.status) {           

            switch (error.response.status) {               

                // 401: 未登录

                // 未登录则跳转登录页面,并携带当前页面的路径

                // 在登录成功后返回当前页面,这一步需要在登录页操作。               

                case 401:                   

                    router.replace({                       

                        path: '/login',                       

                        query: {

                            redirect: router.currentRoute.fullPath

                        }

                    });

                    break;

                // 403 token过期

                // 登录过期对用户进行提示

                // 清除本地token和清空vuex中token对象

                // 跳转登录页面               

                case 403:

                    Toast({

                        message: '登录过期,请重新登录',

                        duration: 1000,

                        forbidClick: true                    });

                    // 清除token

                    localStorage.removeItem('token');

                    store.commit('loginSuccess', null);

                    // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面

                    setTimeout(() => {                       

                        router.replace({                           

                            path: '/login',                           

                            query: {

                                redirect: router.currentRoute.fullPath

                            }                       

                        });                   

                    }, 1000);                   

                    break;

                // 404请求不存在

                case 404:

                    Toast({

                        message: '网络请求不存在',

                        duration: 1500,

                        forbidClick: true                    });

                    break;

                // 其他错误,直接抛出错误提示

                default:

                    Toast({

                        message: error.response.data.message,

                        duration: 1500,

                        forbidClick: true                    });

            }

            return Promise.reject(error.response);

        }

    }   

});



/**

这里封装请求方法可根据个人喜好来填

* get方法,对应get请求

* @param {String} url [请求的url地址]

* @param {Object} params [请求时携带的参数]

*/export function get(url, params){   

    return new Promise((resolve, reject) =>{       

        axios.get(url, {           

            params: params       

        }).then(res => {

            resolve(res.data);

        }).catch(err =>{

            reject(err.data)       

    })   

});

/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function fetch(url,params={}){
  return new Promise((resolve,reject) => {
    axios.get(url,{
      params:params
    })
    .then(response => {
      resolve(response.data);
    })
    .catch(err => {
      reject(err)
    })
  })
}


/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

 export function post(url,data = {}){
   return new Promise((resolve,reject) => {
     axios.post(url,data)
          .then(response => {
            resolve(response.data);
          },err => {
            reject(err)
          })
   })
 }

 /**
 * 封装patch请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function patch(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.patch(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}

 /**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.put(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 安装依赖 安装axios npm i axios 安装qs npm i qs 封装 【utils/request....
    瞌睡大伯父阅读 1,670评论 3 17
  • 为什么要对Axios进行封装 通常我们的项目会越做越大,页面也会越来越多,如果页面非常的少,直接用axios也没有...
    Guyere阅读 1,687评论 0 0
  • vue脚手架中,全局封装axios,让使用过程中更方便,更加容易管理各种api接口 一、axios封装——http...
    coderluojz阅读 322评论 0 2
  • 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在...
    lan1997阅读 1,361评论 0 1
  • vue中Axios的封装和API接口的管理 我们所要的说的axios的封装和api接口的统一管理,其实主要目的就是...
    古月梦回阅读 1,333评论 0 0