ajax请求工具函数

108 阅读2分钟

基于 wx.request 封装请求工具函数

/** 请求基地址 */
const BASE_URL = 'xxxx'
/* 记录请求的数量 */
const QUEUE = []

/** 拦截器 */
const interceptors = {
  //  请求拦截器
  request(params) {
    return Object.assign({}, params, {
      header: {
        author: 'xxx'
      }
    })
  },

  //  响应拦截器
  response({ data: { result } }) {
    return result
  }
}

/** 请求函数 */
function http(params) {

  params.url = BASE_URL + params.url

  return new Promise((resolve, reject) => {
    
    //  调用请求拦截器
    params = interceptors.request(params)
    
    //  开启Loading
    QUEUE.length === 0 && wx.showLoading({ title: '正在加载...', mask: true })

    /* 成功 */
    params.success = (res) => {
      resolve(interceptors.response(res))
    }

    /* 失败 */
    params.fail = (err) => {
      reject(err)
    }

    /* 不管成功失败 */
    params.complete = () => {
      //  每当一次请求结束后,就将数组 QUEUE 的长度减1
      QUEUE.pop()
      QUEUE.length === 0 && wx.hideLoading()
    }

    QUEUE.push('loading')

    wx.request(params)

  })
}

/** 快捷方法  GET 请求 */
http.get = (url, data) => {
  return http({
    url,
    method: 'GET',
    data
  })
}
/** 快捷方法  POST 请求 */
http.post = (url, data) => {
  return http({
    url,
    method: 'POST',
    data
  })
}


export default http

基于 uni.request 封装请求工具函数 Vue3-TS 版本

import { useMemberStore } from '@/stores'

/* 基地址 */
const BASE_URL: string = 'xxx'

/* 记录当前请求的数量 */
const QUEUE: Array<string> = []

/* 定义接口响应的数据类型 */
interface Data<T> {
  msg: string
  result: T
}

/** 请求拦截器 */
const interceptor: UniApp.InterceptorOptions = {
  invoke(options: UniApp.RequestOptions) {
    //  拼接请求地址
    if (!options.url.startsWith('http')) {
      options.url = BASE_URL + options.url
    }

    //  请求超时事件
    options.timeout = 10000

    //  请求头
    options.header = {
      //  保留原本的头信息
      ...options.header,
      //  追加新属性
      'source-client': 'miniapp',
    }

    //  携带token
    const memberStore = useMemberStore()
    const token = memberStore.profile?.token
    if (!token) return
    options.header.Authorization = token
  },

  success() {},

  fail() {},

  complete() {},
}

/** 请求函数(响应拦截器) */
export default <T>(options: UniApp.RequestOptions) => {
  return new Promise<T>((resolve: Function, reject: Function) => {
    //  开启Loading
    QUEUE.length === 0 && uni.showLoading({ title: '加载中...', mask: true })
    
    QUEUE.push('loading')
    
    uni.request({
      ...options,

      //  请求成功
      success(response: UniApp.RequestSuccessCallbackResult) {
        const { data, errMsg, statusCode } = response

        if (statusCode >= 200 && statusCode < 300) {
          //  保存数据
          resolve((data as Data<T>).result)
        } else if (statusCode === 401) {
          //  提示用户登录状态已过期
          uni.showToast({
            icon: 'none',
            title: errMsg || '登录信息已过期,请重新登录',
          })

          //  清空用户信息
          const memberStore = useMemberStore()
          memberStore.clearProfile()

          //  跳转至登录
          uni.navigateTo({ url: 'pages/login/login' })

          reject(new Error(errMsg))
        } else {
          //  其它错误
          uni.showToast({
            icon: 'none',
            title: errMsg || '请求异常',
          })
          reject(new Error(errMsg))
        }
      },

      //  请求失败
      fail(error: UniApp.GeneralCallbackResult) {
        uni.showToast({
          icon: 'none',
          title: error.errMsg || '网络异常,请稍后重试',
        })
        reject(new Error(error.errMsg))
      },

      //  不管成功还是失败
      complete() {
        //  每当一次请求结束后,都将数组 QUEUE 数组的长度减1
        QUEUE.pop()

        QUEUE.length === 0 && uni.hideLoading()
      },
    })
  })
}

uni.addInterceptor('request', interceptor) //  普通请求
uni.addInterceptor('uploadFile', interceptor) //  文件上传