当前位置:首页 > 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使用npm

uniapp使用npm

uniapp中使用npm的方法 uniapp支持通过npm安装和管理第三方依赖包,以下是具体操作步骤: 安装Node.js环境 确保本地已安装Node.js(建议使用LTS版本),安装后会自动包含n…

uniapp安装axios

uniapp安装axios

安装axios 在uniapp项目中安装axios需要确保项目支持node_modules管理。通过npm或yarn安装axios: npm install axios # 或 yarn add a…

uniapp支付功能怎么实现

uniapp支付功能怎么实现

uniapp支付功能实现方法 准备工作 注册微信支付、支付宝等平台的开发者账号,获取必要的商户ID(mch_id)、API密钥(key)、应用ID(appid)等信息。确保项目已配置好相关支付SDK。…

uniapp swiper禁止滑动

uniapp swiper禁止滑动

禁用 Swiper 滑动的方法 在 UniApp 中,可以通过设置 disableTouch 属性或动态绑定 touchable 属性来禁止 Swiper 组件的滑动行为。 方法一:通过 disab…

uniapp特性

uniapp特性

uniapp的核心特性 跨平台开发 uniapp支持一套代码编译到多个平台,包括iOS、Android、H5、微信小程序、支付宝小程序、百度小程序、字节跳动小程序等。开发者无需为不同平台单独编写代码。…

丸子uniapp

丸子uniapp

丸子UniApp简介 丸子UniApp是一个基于UniApp框架开发的移动应用解决方案,通常用于快速构建跨平台应用(如微信小程序、H5、Android/iOS等)。其核心特点是利用UniApp的“一次…