当前位置:首页 > uni-app

uniapp 网络封装

2026-02-05 20:19:54uni-app

uniapp 网络请求封装方法

uniapp 提供了 uni.request 进行网络请求,但直接使用会导致代码冗余。以下是常见的封装方案:

基础封装示例

创建一个 request.js 文件,封装基础请求功能:

const BASE_URL = 'https://api.example.com';

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);
      }
    });
  });
};

export default request;

使用示例

import request from './request.js';

// GET 请求
request({
  url: '/user/list',
  method: 'GET'
}).then(res => {
  console.log(res);
}).catch(err => {
  console.error(err);
});

// POST 请求
request({
  url: '/user/add',
  method: 'POST',
  data: { name: 'John' }
}).then(res => {
  console.log(res);
});

进阶功能扩展

拦截器实现

request.js 中添加请求和响应拦截:

// 请求拦截
const requestInterceptor = (config) => {
  // 添加 token
  const token = uni.getStorageSync('token');
  if (token) {
    config.header.Authorization = `Bearer ${token}`;
  }
  return config;
};

// 响应拦截
const responseInterceptor = (response) => {
  if (response.data.code !== 200) {
    uni.showToast({ title: response.data.msg, icon: 'none' });
    return Promise.reject(response.data);
  }
  return response.data;
};

const request = (options) => {
  options = requestInterceptor(options) || options;
  return new Promise((resolve, reject) => {
    uni.request({
      // ...原有配置
      success: (res) => {
        resolve(responseInterceptor(res));
      },
      fail: (err) => {
        uni.showToast({ title: '网络错误', icon: 'none' });
        reject(err);
      }
    });
  });
};

超时与重试机制

添加超时控制和自动重试:

const request = (options) => {
  const retryCount = options.retry || 0;
  let currentRetry = 0;

  const doRequest = () => {
    return new Promise((resolve, reject) => {
      const timer = setTimeout(() => {
        reject(new Error('请求超时'));
      }, options.timeout || 10000);

      uni.request({
        // ...原有配置
        complete: () => clearTimeout(timer),
        success: (res) => {
          if (res.statusCode === 200) {
            resolve(res.data);
          } else if (currentRetry < retryCount) {
            currentRetry++;
            doRequest().then(resolve).catch(reject);
          } else {
            reject(res.data);
          }
        },
        fail: (err) => {
          if (currentRetry < retryCount) {
            currentRetry++;
            doRequest().then(resolve).catch(reject);
          } else {
            reject(err);
          }
        }
      });
    });
  };

  return doRequest();
};

TypeScript 支持

为封装添加类型定义:

uniapp 网络封装

interface RequestOptions {
  url: string;
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
  data?: any;
  header?: Record<string, string>;
  timeout?: number;
  retry?: number;
}

const request = (options: RequestOptions): Promise<any> => {
  // ...实现代码
};

注意事项

  1. 跨域问题需在服务端配置 CORS 或使用代理
  2. 小程序端需将域名加入合法列表
  3. 文件上传使用 uni.uploadFile 需单独封装
  4. 长时间未响应的请求建议主动取消(通过 abort

这种封装方式可以大幅减少重复代码,统一处理错误和加载状态,适合大多数 uniapp 项目场景。根据实际需求可以进一步扩展缓存、mock数据等功能。

标签: 网络uniapp
分享给朋友:

相关文章

uniapp和vue有什么区别

uniapp和vue有什么区别

uniapp和vue的区别 1. 定位与用途 Vue:一个渐进式JavaScript框架,专注于构建用户界面,适用于开发单页应用(SPA)或复杂前端项目。 UniApp:基于Vue.js的跨…

uniapp样式库

uniapp样式库

uniapp 常用样式库推荐 uView UI uView 是专为 uniapp 设计的多端兼容 UI 框架,提供丰富的组件和工具类。支持 Vue3 组合式 API,内置主题定制功能,常用于快速构建企…

uniapp前端页面

uniapp前端页面

Uniapp 前端页面开发指南 Uniapp 是一个基于 Vue.js 的跨平台开发框架,支持一次开发,多端部署(H5、小程序、App等)。以下是开发 Uniapp 前端页面的关键方法和注意事项。…

uniapp面试问啥

uniapp面试问啥

技术基础类问题 UniApp框架特性 跨端实现原理及条件编译的使用场景 如何理解"一次开发,多端运行"的优缺点 rpx与vw/vh单位的适配差异 Vue相关 生命周期在UniA…

uniapp实现懒加载

uniapp实现懒加载

uniapp实现懒加载的方法 在uniapp中实现懒加载可以通过多种方式,以下是几种常见的方法: 使用uni.lazyLoad组件 uniapp提供了内置的懒加载组件,适用于图片等资源的懒加载。在页…

uniapp中如何引用echarts

uniapp中如何引用echarts

在uniapp中引用echarts uniapp中引用echarts可以通过原生方式或第三方插件实现,以下是具体方法: 使用原生echarts 安装echarts依赖 在项目根目录下执行命令:…