uniapp中uni.request的统一封装 (ts版)

文章目录

前言

在uniapp中如何去更简洁高效的发送我们的请求,下面就介绍了uni.request()二次封装。


一、我们为什么要去封装?

在 UniApp 中,uni.request 是用于发起网络请求的方法。为了简化代码、提高可维护性和统一管理请求逻辑,通常会对 uni.request 进行统一封装。以下是一个简单的封装示例:

二、具体实现

1.创建一个请求封装文件:

在src目录下新建一个文件,比如 request.js,用于存放封装后的请求方法。


2.封装 uni.request:

代码如下(示例):

c 复制代码
/**
 * 添加拦截器:
 *   拦截 request 请求
 *
 * TODO:
 *   1. 非 http 开头需拼接地址
 *   2. 请求超时
 *   3. 添加小程序端请求头标识
 *   4. 添加 token 请求头标识
 */

import { useUserStore} from '@/stores'

// '填写你的网络请求基地址' 以下是我自己开发的服务器接口,你们换成你们自己的服务器地址
const baseURL = 'http://localhost:3000/api'

// 添加拦截器
const httpInterceptor = {
  // 拦截前触发
  invoke(options:UniApp.RequestOptions) {
    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith('http')) {
      options.url = baseURL + options.url
    }
    // 2. 请求超时, 默认 60s
    options.timeout = 10000
    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      'source-client': 'miniapp',
    }
    // 4. 添加 token 请求头标识
    // pina仓库里面存的token信息
    const userStore= useUserStore()
    const token = userStore.userInfo?.token
  	// 统一携带token
    if (token) {
      options.header.Authorization = token
    }
  },
}
// 最后添加到uniapp的拦截器上
uni.addInterceptor('request', httpInterceptor)
type Data<T> = {
  code: string
  msg: string
  result: T
}

// 2.2 添加类型,支持泛型
export const request= <T>(options:UniApp.RequestOptions) => {
  // 1. 返回 Promise 对象
  return new Promise<Data<T>>((resolve, reject) => {
    uni.request({
      ...options,
      // 响应成功
      success(res) {
        // 状态码 2xx, axios 就是这样设计的
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 2.1 提取核心数据 res.data
          resolve(res.data as Data<T>)
        } else if (res.statusCode === 401) {
          // 401错误  -> 清理用户信息,跳转到登录页
          const userStore = useUserStore()
          userStore .clearUserInfo()
          uni.navigateTo({ url: '/pages/login/login' })
          reject(res)
        } else {
          // 其他错误 -> 根据后端错误信息轻提示
          uni.showToast({
            icon: 'none',
            title: (res.data as Data<T>).msg || '请求错误',
          })
          reject(res)
        }
      },
      // 响应失败
      fail(err) {
        uni.showToast({
          icon: 'none',
          title: '网络错误,换个网络试试',
        })
        reject(err)
      },
    })
  })
}

3.如何去使用?

在需要请求的地方进行进入操作

总结

以上就是今天要讲的内容,本文仅仅简单介绍了uniapp中uni.request()的二次封装,uniapp官方文档还有很多介绍,以上就是个人的学习分享,仅供参考。

相关推荐
沛沛老爹7 分钟前
Web转AI决策篇 Agent Skills vs MCP:选型决策矩阵与评估标准
java·前端·人工智能·架构·rag·web转型
丝斯201115 分钟前
AI学习笔记整理(49)——大模型应用开发框架:LangChain
人工智能·笔记·学习
saoys16 分钟前
Opencv 学习笔记:循环读取文件夹中图片并动态展示
笔记·opencv·学习
字节架构前端18 分钟前
媒体采集标准草案 与 Chromium 音频采集实现简介
前端·chrome·音视频开发
奋斗的小青年!!19 分钟前
Flutter在OpenHarmony上实现渐变文字动画的深度优化实践
前端·flutter·harmonyos·鸿蒙
梦65022 分钟前
Vue3 计算属性 (computed) 与监听属性 (watch)
前端·javascript·vue.js
Front思36 分钟前
uniapp解决点击穿透问题总结
uni-app
六月June June37 分钟前
leaflet L.popup().setContent中挂载vue组件
前端·javascript·vue.js
软件开发技术深度爱好者39 分钟前
JavaScript的p5.js库使用详解(上)
开发语言·javascript
首席拯救HMI官40 分钟前
【拯救HMI】HMI容错设计:如何减少操作失误并快速纠错?
大数据·运维·前端·javascript·网络·学习