当前位置:首页 > uni-app

uniapp 如何封装request请求

2026-01-13 19:42:53uni-app

封装 request 请求的核心思路

在 UniApp 中封装请求通常基于 uni.request,通过统一处理 URL、参数、header 和拦截逻辑提升代码复用性。以下是一个完整封装方案:

创建基础请求模块

新建 utils/request.js 文件,实现基础封装:

const BASE_URL = 'https://your-api-domain.com/api'

const request = (options) => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + options.url,
      method: options.method || 'GET',
      data: options.data || {},
      header: {
        'Content-Type': 'application/json',
        ...options.header
      },
      success: (res) => {
        if (res.statusCode === 200) {
          resolve(res.data)
        } else {
          reject(res.data)
        }
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

添加请求拦截器

在发出请求前统一处理 token 等认证信息:

const getToken = () => uni.getStorageSync('token')

const requestWithInterceptor = (options) => {
  const token = getToken()
  if (token) {
    options.header = {
      ...options.header,
      'Authorization': `Bearer ${token}`
    }
  }
  return request(options)
}

实现响应拦截器

处理通用响应逻辑,如 token 过期:

const handleResponse = (response) => {
  if (response.code === 401) {
    uni.navigateTo({ url: '/pages/login/login' })
    return Promise.reject(response)
  }
  return response.data
}

const enhancedRequest = async (options) => {
  try {
    const res = await requestWithInterceptor(options)
    return handleResponse(res)
  } catch (error) {
    uni.showToast({ title: error.message, icon: 'none' })
    throw error
  }
}

按业务模块封装 API

创建 api/user.js 组织具体接口:

import { enhancedRequest } from '../utils/request'

export const login = (data) => {
  return enhancedRequest({
    url: '/user/login',
    method: 'POST',
    data
  })
}

export const getUserInfo = () => {
  return enhancedRequest({
    url: '/user/info',
    method: 'GET'
  })
}

全局挂载与使用

main.js 中挂载到 Vue 原型:

import * as api from './utils/api'
Vue.prototype.$api = api

组件内调用方式:

export default {
  methods: {
    async fetchData() {
      try {
        const res = await this.$api.getUserInfo()
        console.log(res)
      } catch (error) {
        console.error(error)
      }
    }
  }
}

高级功能扩展

  1. 取消请求:使用 AbortController

    const controller = new AbortController()
    uni.request({
      signal: controller.signal
    })
    // 取消请求
    controller.abort()
  2. 文件上传:封装 uni.uploadFile

    const uploadFile = (filePath) => {
      return uni.uploadFile({
        url: BASE_URL + '/upload',
        filePath,
        name: 'file',
        header: { 'Authorization': getToken() }
      })
    }
  3. 请求重试:对失败请求自动重试

    const retryRequest = (options, retries = 3) => {
      return enhancedRequest(options).catch(err => {
        return retries > 0 ? retryRequest(options, retries - 1) : Promise.reject(err)
      })
    }

这种封装方式实现了以下特性:

  • 统一的 BASE_URL 配置
  • 自动携带身份验证 token
  • 全局错误处理和提示
  • 业务逻辑与网络请求分离
  • 支持扩展高级功能

uniapp 如何封装request请求

标签: uniapprequest
分享给朋友:

相关文章

uniapp开发

uniapp开发

uniapp开发简介 uniapp是一款基于Vue.js的跨平台开发框架,支持一次开发,多端部署。开发者可以通过编写一套代码,发布到iOS、Android、Web以及各种小程序平台(如微信、支付宝、百…

uniapp删除

uniapp删除

卸载 uniapp 项目依赖 在项目根目录下执行以下命令,移除 node_modules 和依赖锁文件: rm -rf node_modules package-lock.json 如需清理全局…

uniapp怎么使用

uniapp怎么使用

安装与开发环境搭建 下载HBuilderX作为开发工具,这是官方推荐的IDE,内置uniapp项目模板和调试工具。安装后通过新建项目选择uniapp模板,支持Vue.js语法。确保Node.js环境已…

uniapp 消息推送

uniapp 消息推送

uniapp 消息推送实现方法 使用uniPush服务 uniapp官方提供了uniPush服务,支持iOS、Android及小程序平台的消息推送。需要在manifest.json中配置推送模块,并按…

uniapp倒计时

uniapp倒计时

uniapp倒计时的实现方法 在uniapp中实现倒计时功能可以通过多种方式完成,以下是几种常见的实现方法: 使用setInterval实现基础倒计时 通过JavaScript的setInterv…

uniapp 极光推送

uniapp 极光推送

uniapp 集成极光推送的方法 在 uniapp 中集成极光推送,需要使用官方提供的插件或自行封装原生模块。以下是具体实现方式: 使用官方插件 在 uni-app 插件市场搜索「极光推送」插件,…