当前位置:首页 > 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 组织具体接口:

uniapp 如何封装request请求

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

    uniapp 如何封装request请求

    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
  • 全局错误处理和提示
  • 业务逻辑与网络请求分离
  • 支持扩展高级功能

标签: uniapprequest
分享给朋友:

相关文章

uniapp 极光推送

uniapp 极光推送

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

uniapp安装uview

uniapp安装uview

安装uView到UniApp项目 方法一:通过npm安装(推荐) 确保项目已初始化npm,在项目根目录执行以下命令: npm install uview-ui 在main.js文件中引入并注册uV…

uniapp斑马

uniapp斑马

uniapp 斑马相关问题解答 uniapp 斑马打印机连接与使用 uniapp 支持通过蓝牙或网络连接斑马打印机,需要借助原生插件或第三方 SDK。以下为常见方法: 蓝牙连接方式 安装 uni-…

uniapp 绘图

uniapp 绘图

uniapp 绘图方法 使用 Canvas 组件 uniapp 支持通过 canvas 组件实现绘图功能。在模板中声明 canvas 并设置宽度、高度和 ID,通过 JavaScript 调用绘图 A…

uniapp 头条

uniapp 头条

uniapp 适配今日头条(字节跳动小程序)的方法 环境配置 确保HBuilderX版本在2.7.0以上,manifest.json中勾选"字节跳动小程序"平台。在开发者工具中配置正确的AppID和项…

eeui uniapp

eeui uniapp

关于 EEUI 和 UniApp 的解析 EEUI 和 UniApp 是两个不同的跨平台开发框架,均用于快速构建多端应用。以下是它们的核心特点和对比分析: EEUI 框架特点 EEUI 是一个基于…