当前位置:首页 > uni-app

uniapp 网络封装

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

uniapp 网络请求封装方法

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

基础封装示例

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

uniapp 网络封装

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

进阶功能扩展

拦截器实现

uniapp 网络封装

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 支持

为封装添加类型定义:

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怎么使用

uniapp怎么使用

安装与开发环境搭建 下载HBuilderX作为开发工具,这是官方推荐的IDE,内置uniapp项目模板和调试工具。安装后通过新建项目选择uniapp模板,支持Vue.js语法。确保Node.js环境已…

uniapp旋转横屏

uniapp旋转横屏

实现横屏模式的方法 在UniApp中实现横屏模式,可以通过配置页面方向或使用CSS旋转实现。以下是两种常见方法: 修改manifest.json配置 在项目的manifest.json文件中,找到…

uniapp前端页面

uniapp前端页面

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

uniapp可以用vant吗

uniapp可以用vant吗

uniapp中使用Vant组件库的可行性 Vant是专为Vue.js设计的移动端组件库,而uniapp是一个跨平台开发框架。两者并非原生兼容,但可通过以下方式实现部分Vant组件的使用。 方法一:…

uniapp指南

uniapp指南

开发环境搭建 下载HBuilderX作为官方推荐的开发工具,支持Windows和Mac系统。安装后创建uni-app项目,选择模板(如默认模板、Hello Uni-app等)。确保Node.js版本在…

uniapp 用法

uniapp 用法

uniapp 基本概念 uniapp 是一个基于 Vue.js 的跨平台开发框架,支持编译到 iOS、Android、H5 及小程序等多端。其核心特点是“一次开发,多端发布”,通过条件编译实现平台差异…