当前位置:首页 > 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设置背景

设置全局背景样式 在App.vue文件中添加全局样式,使用page选择器设置页面背景。这种方式会影响所有页面背景。 <style> page { background-col…

base64转换方法uniapp

base64转换方法uniapp

Base64 转换方法(UniApp) 在 UniApp 中实现 Base64 编码和解码,可以通过原生 JavaScript 的 btoa 和 atob 方法,或使用第三方库如 base64-js。…

uniapp营销

uniapp营销

营销策略 采用社交媒体推广,结合微信、微博、抖音等平台进行内容营销。通过短视频、直播等形式展示产品特点,吸引用户关注。利用KOL合作,扩大品牌影响力,提高用户信任度。 用户裂变 设计裂变活动,如邀…

uniapp 绘图

uniapp 绘图

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

uniapp审批

uniapp审批

uniapp审批流程实现 在uniapp中实现审批功能,通常需要结合前端界面和后端逻辑。以下是几种常见的实现方式: 前端界面设计 使用uniapp的组件和API构建审批界面,包括表单提交、审批列表展…

uniapp 头条

uniapp 头条

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