基于小程序的网络请求框架

封装网络请求类

/**
 * 网络请求类
 *
 * @author zhanghaohao  
 * @date 2019-6-19
 */

const statusCode_success = '200'; //开发者服务器返回的 HTTP 成功状态码
const CODE_SUCCESS = '0'; //接口请求成功的CODE
const CODE_TOKEN_TIMEOUT = '50001'; //用户token过期CODE
const config = require('../config.js');
const ModalUtil = require('../utils/ModalUtil.js');
const ToastUtil = require('../utils/ToastUtil.js');
const util = require('../utils/util.js');

// //请求返回体模型
const httpModel = {
  code: 0,
  message: '',
  object: {}
}

/**
 * 拦截器
 */
function requestInterceptor(reqParams) {
  //做请求前的拦截处理

  return reqParams;
}

/**
 * 失败返回统一处理
 */
function handleFailResponse(message) {
  wx.showToast({
    title: message,
    icon: 'loading',
    duration: 2000
  })
}

/**
 * 打印请求地址
 */
function logRequestUrl(reqParams) {
  //显示请求路径
  var url = '请求路径: ' + config.API_SERVICE + reqParams.url;
  var paramCount = objCount(reqParams.params);
  if (paramCount > 0) {
    url += '?';
  }
  var i = 0;
  for (var item in reqParams.params) { //用javascript的for/in循环遍历对象的属性 
    if (i != (paramCount - 1)) { //不是最后一个才加上&
      url += item + "=" + reqParams.params[item] + '&';
    } else {
      url += item + "=" + reqParams.params[item];
    }

    i++;
  }
  console.log(url);
}

/**
 * 获取对象、数组的长度、元素个数
 * 
 * @param obj 要计算长度的元素,可以为object、array、string
 */
function objCount(obj) {
  var objType = typeof obj;
  if (objType == "string") {
    return obj.length;
  } else if (objType == "object") {
    var objLen = 0;
    for (var i in obj) {
      objLen++;
    }
    return objLen;
  }
  return false;
}

function wxPromise(method, reqParams) {
  
  //返回一个Promise对象
  return new Promise(function(resolve, reject) {
    //打印请求地址
    // logRequestUrl(reqParams);
    //判断是否需要显示loading
    var isLoading = false;
    if (reqParams.loading != null && reqParams.loading != '') {
      isLoading = true;
      wx.showLoading({
        title: reqParams.loading,
      })
    }
    var ContentType = reqParams.ContentType;
    if (util.isNullValue(ContentType)) {
      ContentType = "application/json";
    }
    wx.request({
      url: config.API_SERVICE + reqParams.url,
      method: method,
      data: reqParams.params,
      //在header中统一封装报文头,这样不用每个接口都写一样的报文头定义的代码
      header: {
        "Content-Type": ContentType,
        "token": "token"
      },
      success: function(res) {
        //关闭loading
        if (isLoading)
          wx.hideLoading();

        //根据自己项目服务端定义的正确的返回码来进行
        if (res.data.errorCode == CODE_SUCCESS) {
          resolve(res.data.body);
        } else if (res.data.errorCode == CODE_TOKEN_TIMEOUT){
          //token失效
          wx.showModal({
            title: '提示',
            content: errMsg,
            confirmColor: '#118EDE',
            showCancel: false,
            success: function (res) {
              if (res.confirm) { }
            }
          });
        } else {
          var errMsg = res.data.message == null ? '异常' : res.data.message;
          //如果出现异常则弹出toast
          ToastUtil.showHintToast(errMsg);
          reject(res);
        }
      },
      fail: function(res) {
        console.log(res);
        //关闭loading
        if (isLoading)
          wx.hideLoading();
        ToastUtil.showHintToast('请求异常');
        reject(res);
      },
      complete: function(res) {
      },

    });
  });
}


function getRequest(reqParams) {
  reqParams = requestInterceptor(reqParams);
  return wxPromise("GET", reqParams);
}

function postRequest(reqParams) {
  reqParams = requestInterceptor(reqParams);
  return wxPromise("POST", reqParams);
}

module.exports = {
  postRequest: postRequest,
  getRequest: getRequest,
}

网络请求API类

/**
 * 网络请求API
 *
 * @author zhanghaohao  
 * @date 2019-6-20
 */
const HTTP = require('HTTP.js');

/**
 * 测试例子
 */
function test() {
  var reqParams = {
    loading: "获取中",
    url: '/demo/test/object',
    params: {
      "avatarUrl": '1111'
    },
    ContentType: "application/x-www-form-urlencoded"
  }
  
  return HTTP.postRequest(reqParams);
}

module.exports = {
  test: test,
}

在页面代码中只需要这样

 WXAPI.test().then(res => {
     console.log(res);
 });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值