wx.request的封装

let CONSTANT = require('../api/constant')
// 从本地存储Storage中获取token值
function getAccessToken() {
  return wx.getStorageSync(CONSTANT.ACCESSTOKEN);
}
function getXAccessToken() {
  return wx.getStorageSync(CONSTANT.XCCESSTOKEN);
}

// 创建请求头header的内容
function buildHeaders(isJson) {
  let headers = {
    "Content-Type": isJson ? 'application/json' : "application/x-www-form-urlencoded",
    "version": CONSTANT.MINI_VERSION,
  };
  const accessToken = getAccessToken();
  if (accessToken) {
    headers['Authorization'] = `Bearer ${accessToken}`;
  }
  return headers;
}

// wx.getNetworkType判断网路类型。eg:wifi、2g、3g...;none值表示无网路
function fetchApi(url, params, method, isJson) {
  wx.getNetworkType({
    success: function (res) {
      console.info(res);
      // &&表示“并”"none" === e.networkType如果为真,才会去执行&&后面的内容,否则不执行
      "none" === res.networkType && (wx.hideLoading(), wx.showModal({
        title: "提示",
        content: "当前无网络,请检查网络设置后重新加载",
        showCancel: false
      }));
    }
  });
  return new Promise((resolve, reject) => {
    wx.request({
      url: `${CONSTANT.API_IP}${url}`,
      method: method,
      header: buildHeaders(isJson),
      data: params,
      success: function (res) {
        // 并重新请求获取token值
        if (401 == res.statusCode) {
          wx.login({
            success: res => {
              console.info(' wx.login', res.code);
              wx.request({
                url: CONSTANT.API_IP + "/Weixin/WxOpen/OnLogin",
                method: "GET",
                header: {
                  "version": CONSTANT.MINI_VERSION,
                  "Content-Type": 'application/json',
                },
                data: {
                  code: res.code,
                },
                success: function (res) {
                  console.info('WxOpen/OnLogin', res);
                  wx.removeStorageSync(CONSTANT.ACCESSTOKEN);
                  wx.removeStorageSync(CONSTANT.XCCESSTOKEN);
                  wx.removeStorageSync(CONSTANT.SESSIONID);
                  // 读取Header 内容
                  if (200 === res.statusCode) {
                    wx.setStorageSync(CONSTANT.ACCESSTOKEN, res.header[CONSTANT.ACCESSTOKEN]);
                    wx.setStorageSync(CONSTANT.XCCESSTOKEN, res.header[CONSTANT.XCCESSTOKEN]);
                    wx.setStorageSync(CONSTANT.SESSIONID, res.data.data);

                    console.log("already refresh token", res.data.data);
                    console.info('SESSIONID', wx.getStorageSync(CONSTANT.SESSIONID));
                    console.log("SESSIONID", res.data.data);
                    fetchApi(url, params, method, isJson).then(c => {
                      console.info('fetchApi', c);
                      resolve(c);
                    });
                  }
                }
              });
            }
          });
        }
        // 41020003表示未授权了直接跳转到授权页(请求授权获取用户信息)
        else if (403 == res.statusCode) {
          wx.reLaunch({
            url: "/pages/personal/login"
          });
        }
        else if (404 == res.statusCode) {

        }
        else {
          if (res.header[CONSTANT.ACCESSTOKEN]) {
            console.info(res.header);
            wx.removeStorageSync(CONSTANT.ACCESSTOKEN);
            wx.removeStorageSync(CONSTANT.XCCESSTOKEN);

            wx.setStorageSync(CONSTANT.ACCESSTOKEN, res.header[CONSTANT.ACCESSTOKEN]);
            wx.setStorageSync(CONSTANT.XCCESSTOKEN, res.header[CONSTANT.XCCESSTOKEN]);
          }
          console.info('resolve', res.data);
          resolve(res.data);
        }
      },
      fail: function (res) {
        reject(res.data);
        console.log("network fail.", res);
        wx.showModal({
          title: "系统提示",
          content: "请检查网络:" + JSON.stringify(res),
          showCancel: false
        })

      },
      complete: function (res) {
        // resolve(res.data);
        // console.log('complete', res);
      }
    });
  });
};
module.exports = {
  fetchApi,
  // 定义各种api的方法
  // fetchApi(url, params, method, isJson) {
  //     return fetchApi(url, params, method, isJson);
  // }
}

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注