axios非常方便,但是如果在每个组件中走一遍axios流程,最终又会写出“意大利面条”式的代码。况且很多时候在前端需要设置header,统一添加token,对异常进行处理等,所以最好对其进行封装。结合axios,能够很好的进行封装。
最近项目中,前端遇到获取数据时来自各种不同的项目组,其中有一个提供空间数据的小组为了保证数据的安全性。需要在请求数据前先用规定用户名和密码请求一个token。然后将这个token当必传参数去请求空间数据。为方便同事的使用即封装了一个公共的请求方法。
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| import axios from 'axios'; import Vue from 'vue';
let vm = new Vue({});
function getToken() { return axios({ method: "get", url: vm.usedUrl() + "getCubeDataAccessToken", }) .then(res => { return res; }) .catch(error => { reject(error); }) };
function getCubeToken() { let timestamp = new Date().getTime(); let user = { userName: "user", passWord: "123456" }; let params = { time: timestamp, user: user.userName, secret: vm.md5(timestamp + user.passWord) }; return axios({ method: "get", url: "http://192.168.1.192:9000/ksj_api/getToken", params: params }) .then(res => { return res; }) .catch(error => { reject(error); }); }
async function fetchPost(url, params) { if (!params.request_type) { params.request_type = 'post' } if (params.request_type == 'post' || params.request_type == 'put') { var type = 'data'; } else { var type = 'params' } let httpDefaultOpts = { method: params.request_type, url: url, [type]: '', } delete params.request_type; if (type == "data") { var formData = new FormData(); for(let i in params){ formData.append(i,params[i]); } let token = await getToken(); formData.append("token", token.data.data.data.token); }else{ var formData =params; } httpDefaultOpts[type] = formData; return new Promise((resolve, reject) => { axios(httpDefaultOpts).then(response => { resolve(response) }).catch((error) => { vm.open4('请求发生错误,请检查网络'); reject(error); }) }) }
export default { Ajax(url, params) { return fetchPost(url, params); } };
|
上面既然用到的export default导出对象。就顺便记录一下
JavaScript中AMD和ES6模块的导入导出对比。import,export,export default属于ES6规范。import命令具有提升效果,会提升到整个模块的头部,首先执行。import是解构过程(是在编译阶段执行的)
1 2 3 4 5 6 7 8 9 10 11 12 13
| const a = 'valueA1' export {a}
import {a} from './output.js' console.log(a)
const a = 'valueA1' export default{a}
import a from './output.js' console.log(a)
|
require,exports,module.exports属于AMD规范。
require是运行时调用.require是赋值过程.
在最后写一个调用这个公共axios的例子。
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
| import cubeAxios from "@/assets/axios/cudeAxios";
async getDivisionsByLatLon(lonlat) { let vm = this; var params={ request_type:cubeApi.getDivisionsByLatLon.request_type, paramCodeList:"KJ5008", coordinates:JSON.stringify(lonlat) } let url = vm.cubeCommonUrl()+cubeApi.getDivisionsByLatLon.url; return new Promise((resolve, reject) => { cubeAxios .Ajax(url, params) .then(res => { console.log(res); resolve(res); }) .catch(error => { reject(error); }); }); },
|