一、用Class方法

import axios from "axios";

declare var Promise: any;

export class Request {
static _instance: Request; static getInstance() {
// tslint:disable-next-line:no-unused-expression
this._instance || (this._instance = new Request());
return this._instance;
} config: any; constructor() {
axios.interceptors.request.use(config => {
// 处理请求数据,如添加Header信息等,
// 完善url等
let baseUrl = '';
config.url = `${baseUrl}${config.url}`;
return config;
});
axios.interceptors.response.use(
response => {
// 处理返回数据
return response.data;
},
error => {
if (error.response.status === 401) {
// 未登录
} else if (error.response.status === 400) {
// 错误信息 alert
} return Promise.reject(error);
}
);
} get(url: string, config: object = {}) {
return axios.get(url, config);
} post(url: string, data: any = {}, config: object = {}) {
return axios.post(url, data, config);
} put(url: string, data: any, config: object = {}) {
return axios.put(url, data, config);
} delete(url: string, config: object = {}) {
return axios.delete(url, config);
}
}

用法:

import {Request} from "@/utils/request";

const request = new Request();
const res: any = request.post("/iot/configParam", data);

二、取消重复请求

// 默认利用axios的cancelToken进行防重复提交。
// 如需允许多个提交同时发出。则需要在请求配置config中增加 neverCancel 属性,并设置为true
import axios from "axios";
// import store from '@/store/index';
// import { getSessionId } from '@/utils/auth';
/* 防止重复提交,利用axios的cancelToken */
let pending: any[] = []; // 声明一个数组用于存储每个ajax请求的取消函数和ajax标识
const CancelToken: any = axios.CancelToken;
const removePending: any = (config: any, f: any) => {
  // 获取请求的url
  const flagUrl = config.url;
  // 判断该请求是否在请求队列中
  if (pending.indexOf(flagUrl) !== -1) {
    // 如果在请求中,并存在f,f即axios提供的取消函数
    if (f) {
      f("取消重复请求"); // 执行取消操作
    } else {
      pending.splice(pending.indexOf(flagUrl), 1); // 把这条记录从数组中移除
    }
  } else {
    // 如果不存在在请求队列中,加入队列
    if (f) {
      pending.push(flagUrl);
    }
  }
};
/* 创建axios实例 */
const service = axios.create({
  timeout: 5000 // 请求超时时间
});
/* request拦截器 */
service.interceptors.request.use(
  (config: any) => {
    // neverCancel 配置项,允许多个请求
    if (!config.neverCancel) {
      // 生成cancelToken
      config.cancelToken = new CancelToken((c: any) => {
        removePending(config, c);
      });
    }
    // 在这里可以统一修改请求头,例如 加入 用户 token 等操作
    //   if (store.getters.sessionId) {
    //     config.headers['X-SessionId'] = getSessionId(); // 让每个请求携带token--['X-Token']为自定义key
    //   }
    return config;
  },
  (error: any) => {
    Promise.reject(error);
  }
);
/* respone拦截器 */
service.interceptors.response.use(
  (response: any) => {
    // console.log(response)
    // 移除队列中的该请求,注意这时候没有传第二个参数f
    removePending(response.config);
    // 获取返回数据,并处理。按自己业务需求修改。下面只是个demo
    const code = response.code !== undefined ? response.code : response.status;
    if (code !== 200) {
      return Promise.reject("error");
    } else {
      return response;
    }
  },
  (error: any) => {
    // 异常处理
    console.log(error);
    pending = [];
    if (error.message === "取消重复请求") {
      return Promise.reject(error);
    }
    return Promise.reject(error);
  }
);
export default service;

用法:

import request from "@/utils/request";

request({
  method: "GET",
  url: "/api/workflow/getAllUserPermission",
  // params: {
  //   test: 6
  // }
}).then((result) = > {
  // console.log(result)
}).
catch ((err) = > {
  // console.log(err)
});

三、抛出项目所有的请求方法

import axios, {
AxiosResponse, AxiosRequestConfig
}
from "axios";
import requestConfig from "@/config/requestConfig";
// import {
// showFullScreenLoading,
// tryHideFullScreenLoading
// } from "./axiosHelperLoading";
// 公共参数
const conmomPrams: object = {};
class HttpRequest {
public queue: any; // 请求的url集合
public constructor() {
this.queue = {};
}
destroy(url: string) {
delete this.queue[url];
// 关闭全局的loading...
if (!Object.keys(this.queue).length) {
// tryHideFullScreenLoading();
}
}
interceptors(instance: any, url ? : string) {
// 请求拦截
instance.interceptors.request.use(
(config: AxiosRequestConfig) = > {
// 在请求前统一添加headers信息
config.headers = {};
// 添加全局的loading...
if (!Object.keys(this.queue).length) {
// showFullScreenLoading();
}
if (url) {
this.queue[url] = true;
}
return config;
}, (error: any) = > {
console.error(error);
});
// 响应拦截
instance.interceptors.response.use(
(res: AxiosResponse) = > {
if (url) {
this.destroy(url);
}
const {
data, status
} = res;
// 请求成功
if (status === 200 && data) {
return data;
}
return requestFail(res);
},
// 失败回调
(error: any) = > {
if (url) {
this.destroy(url);
}
console.error(error);
});
}
async request(options: AxiosRequestConfig) {
const instance = axios.create();
await this.interceptors(instance, options.url);
return instance(options);
}
}
// 请求失败
const requestFail = (res: AxiosResponse) = > {
let errCode = 408;
let errStr = "网络繁忙!";
return {
err: console.error({
code: res.data.code || errCode,
msg: res.data.message || errStr
})
};
};
// 合并axios参数
const conbineOptions = (opts: any): AxiosRequestConfig = > {
const _data = {...conmomPrams, ...opts.data
};
const options = {
method: opts.method || "GET",
url: opts.url,
headers: opts.headers
// baseURL: process.env.VUE_APP_BASE_API,
// timeout: 5000
};
return options.method !== "GET" ? Object.assign(options, {
data: _data
}) : Object.assign(options, {
params: _data
});
};
const HTTP = new HttpRequest();
/**
* 抛出整个项目的api方法
*/
const Api = (() = > {
const apiObj: any = {};
const requestList: any = requestConfig;
const fun = (opts: AxiosRequestConfig) = > {
return async(params: any = {}) = > {
Object.assign(opts, params);
const newOpts = conbineOptions(opts);
const res = await HTTP.request(newOpts);
return res;
};
};
Object.keys(requestConfig).forEach(key = > {
let opts = {
url: requestList[key]
};
apiObj[key] = fun(opts);
});
return apiObj;
})();
export
default Api as any;

用法:

import Api from "@/utils/request";

export const getKtUploadYxsj = (params = {}) = > {
return Api.getKtUploadYxsj(params);
};

axios二次封装的几种方法的更多相关文章

  1. 原生 Ajax 封装 和 Axios 二次 封装

    AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...

  2. axios 二次封装

    一般项目往往要对 axios 库进行二次封装,添加一些自定义配置和拦截器等 案例 ./service/axios.js 1234567891011121314151617181920212223242 ...

  3. 【vue】axios二次封装,更好的管理api接口和使用

    在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧.而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios二次封装区别不 ...

  4. PHP生成带logo图像二维码的两种方法

    本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用 ...

  5. 微信支付支付宝支付生成二维码的方法(php生成二维码的三种方法)

    如果图简单,可以用在线生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com 最简单 ...

  6. JS模拟实现封装的三种方法

      前  言  继承是使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承!  JS中有很多实现继承的方法,今天我给大家介绍其中的三种吧. 1.在 Object类上 ...

  7. [PHP] 生成二维码(两种方法)

    方法一:(调用google二维码接口,本人测试网不好,不好用!) <?php //1.封装生成二维码图片的函数(方法) /** *利用google api生成二维码图片 * $content:二 ...

  8. 使用PHP生成二维码的两种方法(带logo图像)

    一.利用Google API生成二维码 Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  9. axios二次封装

    import axios from "axios" //请求拦截器 axios.interceptors.request.use(function (config) { retur ...

随机推荐

  1. spring+mybatis所需各种服务的搭建

    1.mysql5.6 2.jdk1.7 3.zookeeper 4.dubbo-admin 5.activtymq 6.maven 7.nexus 8.mybatis脚本文件生成工具使用

  2. 6、组件注册-@Lazy-bean懒加载

    6.组件注册-@Lazy-bean懒加载 懒加载:单实例bean,默认是在容器启动的时候创建对象:懒加载就是启动的是不创建,在第一次使用的时候再创建对象. @Lazy // 单实例下懒加载bean

  3. 边学边体验django--模型

    步骤: 1.选定数据库,然后修改 settings.py 中的 DATABASES配置 实验过了sqlite3. 应该是这个样子的: 2. 创建app, 建立数据表模型. python manage. ...

  4. HTMl5的存储方式sessionStorage和localStorage区别及联系

    localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据. localStorage 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手 ...

  5. 纯 css 控制隔行变色

    使用::nth-child 选择器 tr:nth-child(odd) { background-color: #ccc; } tr:nth-child(even) { background-colo ...

  6. 如何用 Windows Live Writer 和 Word 2013 分别发表博客到Cnblog 和CSDN

    ps CSDN 老是505错误,放弃了 为什么会写这篇 最近写博客在 Cnblog 上面写博客, 发现图片不能复制了直接粘贴上,这对于把博客当随手笔记的人来说无疑非常痛苦.求助于博客园,他们让我用 W ...

  7. 转义字符\'和\"的使用示例

    /* 转义字符\'和\"的使用示例 */ #include <stdio.h> int main(void) { printf("关于字符串常量和字符常量.\n&quo ...

  8. jenkins之插件下载失败

    1.更换地址 将默认地址 http://updates.jenkins-ci.org/update-center.json 改为 http://mirrors.jenkins-ci.org/statu ...

  9. Django中常用的基本命令

    django-admin   startproject  项目的名称 创建一个项目 python manage.py startapp 应用的名称 创建一个应用 python manage.py ru ...

  10. IDEA配置Hadoop开发环境&编译运行WordCount程序

    有关hadoop及java安装配置请见:https://www.cnblogs.com/lxc1910/p/11734477.html 1.新建Java project: 选择合适的jdk,如图所示: ...