api.js 5.79 KB
/**
 * Created by goto9 on 2018/7/19.
 */
//接口地址,测试环境请修改以下地址
//const server_host='https://xt04.colorcun.com/?s=';
const api_timeout = 2000; //接口超时时间,默认2s

//引入接口映射关系表
import api from './api.url'
import uri_dc from './uri'
const server_host = uri_dc.HOST__LINE;
import rollbar from './rollbar'
/**
 *
 * @param act
 * @param data
 * @param fouce false|true 强制请求服务器,获取最新数据;默认优先使用缓存
 * @param header    追加header
 * @param silence    loading
 * @param cachetime    缓存时间
 * @param timeout    接口超时
 * @returns {Promise}
 */
function rpc(host = '', act, data = {}, fouce = false, header = {}, silence = true, cachetime = 0, timeout = api_timeout) {
  host = host ? host : server_host;
  let param = "";
  for (let key in data) {
    let val = data[key];
    if (val != "") {
      param += '&' + key + '=' + val
    }
  }
  let cache_key = act;
  if (param) {
    cache_key += '?' + param.substr((param.length - 1) * -1);
  }
  if (fouce == 'clear' || fouce == 'clean') {
    return wx.removeStorageSync(cache_key);
  }
  if (!fouce && cachetime != 0) {//优先使用缓存
    let getCache = cache(cache_key);
    //console.log('getCache.'+getCache,cache_key);
    if (getCache != -99999) {
      return new Promise((success, fail) => {
        getCache.isCache = true;
        console.log(cache_key + '\nuse cache', getCache);
        success(getCache);
      })
    }
  }
  if (!silence) {
    wx.showLoading({
      title: '处理中',
      mask: true
    })
  }
  return new Promise((success, fail) => {
    let openid = wx.getStorageSync('customer_openid');
    let formids = wx.getStorageSync('formids');
    if (formids) {
      wx.removeStorage({key: 'formids'});
    }
    let enter_params = wx.getStorageSync('enter_params');
    let operator = ''
    if (enter_params) {
      operator = JSON.stringify({
        uid: enter_params.manager_id,
        openid: enter_params.seller_openid,
        sid: enter_params.seller_id,
      })
    }
    wx.request({
      url: host + act,
      method: 'POST',
      data: data,
      header: {
        ...header,
        openid: openid,
        formids: formids.toString(),
        operator: operator,
        'content-type': 'application/x-www-form-urlencoded'
      },
      success: function (res) {
        console.log('request.api==>', host + cache_key + '\nrequest.success', res.data);
        // return;
        try{
          if (res.data) {
            if (cachetime != 0 && res.data.ret == 200) {
              cache(cache_key, res.data, cachetime);//.then().catch();
            }
            if (res.data.ret !== 200) {
              res.data.msg = res.data.msg.replace('非法请求:', '');
            }
          }
          success(res.data);
        }catch (e){
          rollbar({
            post_host:host,
            openid: openid,
            formids: formids.toString(),
            operator: operator,
            post_data:cache_key,
            response:res,
            catch:JSON.stringify(e),
          })
        }

      },
      fail: function (res) {
        console.log('request.api==>', host + cache_key + '\nrequest.fail', res);
        rollbar({
          post_host:host,
          openid: openid,
          formids: formids.toString(),
          operator: operator,
          post_data:cache_key,
          response:res
        })
        fail(res);
        // let query = wx.createSelectorQuery().selectComponent("#network");
        // let net=query.exec(function(){
        //     console.log('back=>',arguments);
        // });
        //query.show();
        //console.log('net',query);
      },
      complete: function (res) {
        wx.hideLoading();
      }
    })
  })
}

function __api() {
  let tmpApi = {}
  let keys = [];
  for (let key in api) {
    api[key] = api[key] || {};
    keys = key.split('.');
    tmpApi[keys[0]] = tmpApi[keys[0]] ? tmpApi[keys[0]] : {};
    tmpApi[keys[0]][keys[1]] = tmpApi[keys[0]][keys[1]] ? tmpApi[keys[0]][keys[1]] : {};
    tmpApi[keys[0]][keys[1]][keys[2]] = function (data, fouce = false, header) {
      //console.log('api[key].host',api[key].host);
      return rpc(api[key].host, api[key].alias || key, data, fouce, header,
        api[key].silence, api[key].cachetime, api[key].timeout);
    }
  }
  for (let xkey in uri_dc) {
    let key = uri_dc[xkey].toString();
    if (key.indexOf('App.') > -1) {
      keys = key.split('.');
      try {
        if (typeof tmpApi[keys[0]][keys[1]][keys[2]] == 'undefined') {
          throw new Error('undefined');
        }
      } catch (e) {
        api[key] = api[key] || {};
        tmpApi[keys[0]] = tmpApi[keys[0]] ? tmpApi[keys[0]] : {};
        tmpApi[keys[0]][keys[1]] = tmpApi[keys[0]][keys[1]] ? tmpApi[keys[0]][keys[1]] : {};
        tmpApi[keys[0]][keys[1]][keys[2]] = function (data, fouce = false, header) {
          //console.log('api[key].host',api[key]);
          return rpc(api[key].host, api[key].alias || key, data, fouce, header,
            api[key].silence, api[key].cachetime, api[key].timeout);
        }
      }
    }
  }
  //console.log(tmpApi[keys[0]]);
  tmpApi[keys[0]].rollbar=rollbar;
  return tmpApi[keys[0]];
}
function cache(key, val = -99999, timeout = -1) {
  if (val != -99999) {//写入
    return new Promise((success, fail) => {
      let data = {
        data: val,
        timeout: timeout == -1 ? -1 : (Date.parse(new Date()) / 1000 + timeout)
      }
      wx.setStorage({
        key: key,
        data: data,
        success: () => {
          success()
        },
        fail: () => {
          fail()
        }
      });
    })
  }
  let res = wx.getStorageSync(key);
  let time = Date.parse(new Date()) / 1000;
  if (res && (res.timeout == -1 || res.timeout > time) && res.data) {
    return res.data;
  } else {
    return -99999
  }
}
export default __api();