uniapp请求接口封装

前言:

uniapp请求接口封装

实现效果:

实现代码:

核心:request.js
javascript 复制代码
// 是否为本地环境
const isDev = process.env.NODE_ENV === 'development'

// 默认配置
const defaultOptions = {
  baseURL: isDev ? 'https://xxxxx' : '',
  timeout: 15000, // 请求接口超时时间
  dataType: 'json',
  header: {
    'Content-Type': 'application/json'
  },
  showErrToast: true,
  loading: true
}

// 请求核心方法
const request = async (method, url, data = {}, customOptions = {}) => {
  // 合并配置
  const options = {
    ...defaultOptions,
    method,
    data,
  }
  // 请求接口地址处理,如果传来http/https的直接用传来的地址
  if( url.startsWith('http') ||  url.startsWith('https')){
	  options.url = url
  } else {
	  options.url = `${defaultOptions.baseURL}${url}`
  }

  // 请求拦截
  const token = uni.getStorageSync('token')
  if (token) {
    options.header.Authorization = `Bearer ${token}`
  }

  // 显示 Loading
  if (options.loading) {
    uni.showLoading({ title: '加载中...', mask: true })
  }

  
	// 自定义header
	if(customOptions.header){
		options.header = Object.assign(options.header,customOptions.header)
	}

  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      success: (res) => {
        try {
          const processedRes = responseInterceptor(res)
          resolve(processedRes.data)
        } catch (error) {
          reject(error)
        }
      },
      fail: (err) => {
        console.error('[Request Fail]', err)
        if (options.showErrToast) {
          uni.showToast({ title: err.errMsg || '请求失败', icon: 'none' })
        }
        reject(err)
      },
      complete: () => {
        options.loading && uni.hideLoading()
      }
    })
  })
}

// 响应拦截器
const responseInterceptor = (res) => {
  console.log(`[Response] ${res.statusCode}`, res)

  // HTTP 状态码错误
  if (res.statusCode < 200 || res.statusCode >= 300) {
    throw new Error(`接口请求失败 Error: ${res.statusCode}`)
  }

  // 业务状态码处理
  if (res.data?.code === 401) {
    handleUnauthorized()
    throw new Error('登录状态已过期')
  }

  return res
}

// 401 处理封装
const handleUnauthorized = () => {
  const pages = getCurrentPages()
  const currentPage = pages[pages.length - 1]
  const redirectUrl = currentPage ? `/${currentPage.route}` : '/'

  uni.removeStorageSync('token')
  uni.removeStorageSync('userInfo')

  uni.showToast({
    title: '登录已过期',
    icon: 'none',
    duration: 800
  })

  setTimeout(() => {
	// 关闭所有界面,回到登录页面
	uni.reLaunch({
	    url: `/pages/login/index?redirect=${encodeURIComponent(redirectUrl)}` 
	})
  }, 800)
}

// 快捷方法
export const get = (url, data, options) => request('GET', url, data, options)
export const post = (url, data, options) => request('POST', url, data, options)
export const put = (url, data, options) => request('PUT', url, data, options)
export const del = (url, data, options) => request('DELETE', url, data, options)

// 文件上传优化
export const uploadFile = (url, filePath, options = {}) => {
  let fullUrl = ''
  // 请求接口地址处理,如果传来http/https的直接用传来的地址
  if( url.startsWith('http') ||  url.startsWith('https')){
  	  fullUrl = url
  } else {
  	  fullUrl = `${defaultOptions.baseURL}${url}`
  }
  
  return new Promise((resolve, reject) => {
    uni.uploadFile({
      url: fullUrl,
      filePath,
      name: 'file', // 参数字段
      header: {
        Authorization: uni.getStorageSync('token') ? `Bearer ${uni.getStorageSync('token')}` : '',
        ...options.header
      },
      success: (res) => {
        if (res.statusCode === 200) {
          try {
            resolve(JSON.parse(res.data))
          } catch (e) {
            resolve(res.data)
          }
        } else {
          reject(new Error(`上传失败:${res.errMsg}`))
        }
      },
      fail: reject
    })
  })
}
 
// 文件下载
export const downloadFile = (url, options = {}) => {
  const fullUrl = url.startsWith('http') ||  url.startsWith('https') ? url : `${API_URL}${url}`
  return uni.downloadFile({
    url: fullUrl,
    ...options
  })
}
相关推荐
满分观测网友z6 小时前
uni-app 滚动视图scroll-view从入门到精通
uni-app
小妖6666 小时前
uni-app bitmap.load() 返回 code=-100
前端·javascript·uni-app
走,带你去玩6 小时前
uniapp 时钟
javascript·css·uni-app
耶啵奶膘6 小时前
uniapp——input 禁止输入 ,但是可以点击(禁用、可点击)
uni-app
前端与小赵6 小时前
uni-app隐藏返回按钮
前端·uni-app
胡斌附体8 小时前
uniapp小程序不支持动态组件问题
小程序·uni-app·if-else·动态组件·不支持·编译异常
小妖6668 小时前
uni-app 小程序 Cannot read property ‘addEventListener‘ of undefined, mounted hook
小程序·uni-app
二倍本贝9 小时前
【慧游鲁博】【12】小程序端 · 智能导览对接后端文物图片识别功能
小程序·uni-app·vue·软件工程
^Rocky9 小时前
uniapp 腾讯云 COS 文件管理进阶(文件夹分类与批量操作)
uni-app·腾讯云·云存储
军军君0111 小时前
基于Springboot+UniApp+Ai实现模拟面试小工具一:系统需求分析及设计
前端·vue.js·人工智能·spring boot·后端·uni-app·node.js