当前位置:首页 > 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 推送

uniapp 推送实现方法 uniapp 推送功能可以通过多种方式实现,主要包括使用第三方推送服务、原生插件或云服务。以下是几种常见的实现方案: 使用 UniPush 服务 UniPush 是 D…

uniapp分享到facebook

uniapp分享到facebook

使用uniapp分享到Facebook的方法 在uniapp中实现分享到Facebook功能,可以通过调用原生插件或使用第三方SDK。以下是具体实现方式: 安装Facebook SDK插件 在uni…

uniapp 后门

uniapp 后门

关于 uniapp 后门的问题,目前没有权威证据表明 uniapp 官方存在故意植入后门的行为。但作为开发者,需注意以下安全实践: 检查第三方插件和依赖 确保项目中使用的第三方插件来源可靠,定期更新…

uniapp接入

uniapp接入

接入UniApp的基本流程 UniApp是一个基于Vue.js的跨平台开发框架,支持一次开发,多端发布。以下是接入UniApp的基本流程: 环境准备 确保已安装Node.js(建议版本12+)和HB…

uniapp 画板

uniapp 画板

uniapp 实现画板功能的方法 在 uniapp 中实现画板功能,可以通过 canvas 组件结合触摸事件来完成。以下是一个基本的实现方案: 基本画板实现 在 template 中添加 canva…

uniapp有用

uniapp有用

Uniapp 的优势 Uniapp 是一款基于 Vue.js 的跨平台开发框架,支持一次开发,多端发布,适用于 iOS、Android、Web、小程序等多个平台。其核心优势包括: 跨平台兼容…