赞
踩
axios是一个基于 promise 的 HTTP 库,目前,在vue,react框架中也还是备受青睐,根据不同项目的业务,也有许多种不同的封装方法,但不同的应用场景,导致封装的代码风格不一,我这里想总结下封装的思路。
src目录下,http.js文件是对axios的封装,依赖的一些包和方法,下面也会有具体介绍
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做了不同的处理
//返回一个Promise(发送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" } ); }
返回一个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
网址: https://wxyfc.github.io/management-system/#/login,账号:admin 密码:admin 直接点击登录即可
如果对您有帮助请点个小星星哦,谢谢,mua~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。