基于axios的二次封装

1、 axios的封装前言

axios是一个基于 promise 的 HTTP 库,目前,在vue,react框架中也还是备受青睐,根据不同项目的业务,也有许多种不同的封装方法,但不同的应用场景,导致封装的代码风格不一,我这里想总结下封装的思路。

2、 目录结构

src目录下,http.js文件是对axios的封装,依赖的一些包和方法,下面也会有具体介绍

image

3、 封装的基本思路


import axios from 'axios'
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import store from './store';
import { formData } from '@/function'

axios.defaults.timeout = 20000;                        //响应时间
axios.defaults.headers.post[ 'Content-Type' ] = 'application/x-www-form-urlencoded;charset=UTF-8';        //配置请求头

//POST传参序列化(添加请求拦截器)
axios.interceptors.request.use ( ( config ) => {
    //在发送请求之前做某件事
    NProgress.start ();
    let token = store.state.userInfo.userToken
    config.headers.Authorization = `${token ? token : ''}`
    return config;
} , ( error ) => {
    NProgress.done ();
    return Promise.reject ( error );
} );

//返回状态判断(添加响应拦截器)
axios.interceptors.response.use ( ( res ) => {
    //对响应数据做些事
    NProgress.done ();
    return Promise.resolve ( res.data );
} , ( error ) => {
    NProgress.done ();
    return Promise.reject ( error );
} );

我是把后台的token存在vuex里面,当然这会使得刷新的时候数据消失,所以结合本地存储做了对应的处理,大家可以根据自己的需求做相应的存储.

在全局的请求拦截器中做了loading,和request header的配置

对应的响应拦截中也可以对response进行处理,根据后台返回不同的状态码做不同的处理,页面中的axios就只用处理返回正确的请求.

根据业务需求,我这里对get和post做了不同的处理

post请求

export function fetchPost ( url , params , form ) {
    let reqTime = new Date ().getTime ();
    if ( params ) {
        params.reqTime = reqTime;
    } else {
        params = { reqTime }
    }
    if ( form ) {
        params = formData ( params );
    }
    return new Promise ( ( resolve , reject ) => {
        axios.post ( url , params )
            .then ( response => {
                resolve ( response );
            } , err => {
                reject ( err );
                mes ();
            } )
            .catch ( ( error ) => {
                reject ( error )
                mes ();
            } )
    } )
}

由于post请求,后台有时候会要求传formData格式的参数,本文中默认是json格式,所以在此也做了处理,上述也可以看到,如果是fromData格式,可以传第三个参数为true,文中用到的formData方法和mes方法

 export function formData(item) {
    //转换成表单
    let form = new FormData();
    for (let key in item) {
        form.append(key, item[key]);
    }
    return form;
}

function mes () {
    ELEMENT.Message ( {
        message : store.state.language.serveError , //这是我项目中的消息提示,可以自由更改
        type : "error" ,
        duration : 3000 ,
        customClass : "messageBox"
    } );
}

get请求

////返回一个Promise(发送get请求)
export function fetchGet ( url , param , form ) {
    let reqTime = new Date ().getTime ();
    if ( param ) {
        param.reqTime = reqTime;
    } else {
        param = { reqTime }
    }
    if ( form ) {
        param = formData ( param );
    }
    return new Promise ( ( resolve , reject ) => {
        axios.get ( url , { params : param } )
            .then ( response => {
                resolve ( response )
            } , err => {
                reject ( err )
                mes ();
            } )
            .catch ( ( error ) => {
                reject ( error )
                mes ();
            } )
    } )
}

最后暴露出去这两个方法,在main.js中引入

export default {
    fetchPost ,
    fetchGet ,
}

//main.js
import { fetchPost, fetchGet } from './http';
Vue.prototype.$Post = fetchPost;
Vue.prototype.$Get = fetchGet;

在myminxin.js中使用这两个方法

let m = {
    data () {
        return {
            h : "http://localhost:5233"//全局请求地址
        };
    } ,
    } ,

  post ( u , p , f  ) {
      let that = this;
            return new Promise ( ( resolve , reject ) => {
                this.$Post ( this.h + u , p , f ).then ( res => {
                    that.backRequest ( u , res , ts );
                    resolve ( res )
                } ).catch ( ( e ) => {
                    reject ( e )
                } );
            } );
        } ,

 get ( u , p , f ) {
            let that = this;
            return new Promise ( ( resolve , reject ) => {
                this.$Get ( this.h + u , p , f ).then ( res => {
                    resolve ( res )
                } ).catch ( ( e ) => {
                    reject ( e )
                } );
            } );
        } ,      

myminxin也需要在项目中引入,可以全局在main.js中引入,也可以按需导入,大家也可以在对应的错误回调里做一些提示信息之类的,根据不同的需求自由发挥,借助组件库的消息提示,进行封装,

到此,axios的封装已经全部完毕,在项目中我们就可以很愉快的使用this调用get和post请求了,感谢大家观看,mua~

附言:

基于vue+element 的后台管理框架

GitHub: https://github.com/wxyfc/management-system

网址: http://47.94.89.73:8080/zeefile/project/management-js/#/login
,账号:admin 密码:admin 直接点击登录即可

如果对您有帮助请点个小星星哦,谢谢,mua~

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