|
- import request from "./core/request.js"
- import {
- getToken,
- removeToken
- } from "@/utils/auth.js"
-
- // TODO: 设置基础接口地址,可根据小程序体验版和线上版本区分
- let baseUrl = "http://127.0.0.1";
- //可以new多个request来支持多个域名请求
- let $http = new request({
- //接口请求地址
- baseUrl: baseUrl,
- //设置请求头(如果使用报错跨域问题,可能是content-type请求类型和后台那边设置的不一致)
- header: {
- 'content-type': 'application/json;charset=UTF-8'
- },
- // 请求超时时间(默认6000)
- timeout: 10000,
- // 默认配置(可不写)
- config: {
- // 是否自动提示错误
- isPrompt: true,
- // 是否显示加载动画
- load: true,
- // 是否使用数据工厂
- isFactory: true
- }
- });
-
- //当前接口请求数
- let requestNum = 0;
- // 当前失败接口数
- let requestFailNum = 0;
- //请求开始拦截器
- $http.requestStart = function(options) {
- if (options.load) {
- if (requestNum <= 0) {
- //打开加载动画
- uni.showLoading({
- title: '加载中',
- mask: true
- });
- }
- requestNum += 1;
- }
- //请求前加入token,从缓存中读取token,请在登录后将token存储在本地缓存中
- options.header['token'] = getToken();
- return options;
- }
- //请求结束
- $http.requestEnd = function(options) {
- //判断当前接口是否需要加载动画
- if (options.load) {
- requestNum = requestNum - 1;
- if (requestNum <= 0) {
- uni.hideLoading();
- }
- }
- }
- //所有接口数据处理(可在接口里设置不调用此方法)
- //此方法需要开发者根据各自的接口返回类型修改,以下只是模板
- $http.dataFactory = async function(res) {
- if (res.response.statusCode && res.response.statusCode == 200) {
- let httpData = res.response.data;
- if (typeof(httpData) == "string") {
- httpData = JSON.parse(httpData);
- }
- /*********以下只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
- // TODO: 判断数据是否请求成功,根据后端返回的成功状态码修改
- if (httpData.code == 200) {
- // 返回正确的结果(then接受数据)
- return Promise.resolve(httpData);
- } else { //其他错误提示
- if (res.isPrompt) {
- // 自动提示错误
- uni.showToast({
- title: httpData.info || httpData.msg,
- icon: "none",
- duration: 3000
- });
- }
- // 返回错误的结果(catch接受数据)
- return Promise.reject({
- statusCode: 500,
- errMsg: httpData.info || httpData.msg
- });
- }
- /*********以上只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
- } else if (res.response.statusCode && res.response.statusCode == 401) {
- // 用户身份信息过期处理,清除token并返回登录页
- if(requestFailNum <= 0) {
- removeToken();
- uni.showModal({
- title: '温馨提示',
- content: '登录状态过期,请重新登录!',
- confirmText: "确认",
- showCancel: false,
- success: function(result) {
- uni.reLaunch({
- url: '/pages/login/index'
- });
- }
- });
- }
- requestFailNum++;
- return Promise.reject({
- statusCode: res.response.statusCode,
- errMsg: "登录状态过期"
- });
- } else if (res.response.statusCode && res.response.statusCode == 404) {
- // 接口地址不存在
- return Promise.reject({
- statusCode: res.response.statusCode,
- errMsg: "请求失败,请检查接口地址是否正确"
- });
- } else {
- // 返回错误的结果(catch接受数据)
- return Promise.reject({
- statusCode: res.response.statusCode,
- errMsg: "数据工厂验证不通过"
- });
- }
- };
- // 错误回调
- $http.requestError = function(e) {
- if(!e.errMsg) {
- return;
- }
- // e.statusCode === 0 是参数校验错误抛出的
- if (e.statusCode === 0 || e.statusCode === 401) {
- throw e;
- } else {
- // 解决hideLoading会隐藏Toast的bug,setTimeout让showToast在requestEnd回调之后再执行
- setTimeout(() => {
- if(e.errMsg == "request:fail") {
- e.errMsg = "请求失败,请检查接口地址是否正确!"
- }
- uni.showToast({
- title: e.errMsg || "网络错误,请检查一下网络",
- icon: "none",
- duration: 3000
- });
- })
- }
- }
- export default $http;
|