axios二次封装的几种方法
一、用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);
二、取消重复请求
用法:
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二次封装的几种方法的更多相关文章
- 原生 Ajax 封装 和 Axios 二次 封装
AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...
- axios 二次封装
一般项目往往要对 axios 库进行二次封装,添加一些自定义配置和拦截器等 案例 ./service/axios.js 1234567891011121314151617181920212223242 ...
- 【vue】axios二次封装,更好的管理api接口和使用
在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧.而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios二次封装区别不 ...
- PHP生成带logo图像二维码的两种方法
本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用 ...
- 微信支付支付宝支付生成二维码的方法(php生成二维码的三种方法)
如果图简单,可以用在线生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com 最简单 ...
- JS模拟实现封装的三种方法
前 言 继承是使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承! JS中有很多实现继承的方法,今天我给大家介绍其中的三种吧. 1.在 Object类上 ...
- [PHP] 生成二维码(两种方法)
方法一:(调用google二维码接口,本人测试网不好,不好用!) <?php //1.封装生成二维码图片的函数(方法) /** *利用google api生成二维码图片 * $content:二 ...
- 使用PHP生成二维码的两种方法(带logo图像)
一.利用Google API生成二维码 Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- axios二次封装
import axios from "axios" //请求拦截器 axios.interceptors.request.use(function (config) { retur ...
随机推荐
- 6、获取Class中的方法
6.获取Class中的方法 6.1 getMethods() 获取的都是共有的方法(包括父类) 返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,包括那些由类或接口和那些从超类和 ...
- 五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构
1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件 1.1 使用镜像 ...
- Gradle 如何打包 Spring Boot 可执行 JAR
如何在 Gradle 中配置一个项目可以打包为 Spring Boot 可执行 Jar? 你首先需要添加到 org.springframework.boot 到插件中: 例如下面的代码: plugin ...
- java枚举类型总结
java中的枚举类型是jdk1.5新增的一个东西,其本质是一个java.lang.Enum类的子类,每个枚举项是一个静态常量对象,由编译器为每个枚举项分配ordinal和name,其中ordinal是 ...
- 深入理解D3D9
本文写的较为深入,故转载在此留以备案,呵呵~ 原文链接为:http://www.cnblogs.com/effulgent/archive/2009/02/10/1387438.html ------ ...
- form 表单提交数据和文件(fromdata的使用方法)
<!-- 数据和文件一次性提交 --> <form class="form_meren" id="mainForm" name="m ...
- POJ 3616 Milking Time ——(记忆化搜索)
第一眼看是线段交集问题,感觉不会= =.然后发现n是1000,那好像可以n^2建图再做.一想到这里,突然醒悟,直接记忆化搜索就好了啊..太蠢了.. 代码如下: #include <stdio.h ...
- mysql启动关闭脚本
#!/bin/sh mysql_port= mysql_username="root" mysql_password="" function_start_mys ...
- Maven的New中没有Servlet问题(IDEA)
1.问题 第一次使用Maven骨架创建Web项目的时候,遇到了 New 里面没有 servlet 的问题. 2.原因 经过查询,是因为IDEA检测到项目中没有导入相关的 jar 包导致. 3.解决方法 ...
- Angular4.x+Ionic3 踩坑之路之打包时出现JAVASCRIPT HEAP OUT OF MEMORY的几种解决办法
最近开发的一个比较大型的App时打生产环境包是出现内存不足导致打包失败的问题.然后百度发现解决方法都是一样,自己试了一下都没什么暖用,心里只想用呵呵来形容了.最后经朋友介绍,技术问题还得去谷歌,git ...