开发者技术支持-基于 uniapp 开发鸿蒙元服务请求工具封装

举报
yd_246431814 发表于 2026/03/12 11:08:30 2026/03/12
【摘要】  1.1 问题说明在 uniapp 开发鸿蒙元服务过程中,网络请求是数据交互的核心。尽管 uni.request 提供了跨平台能力,但直接使用仍存在诸多痛点:缺乏统一的请求拦截与响应拦截、错误处理分散、Loading 状态管理混乱、请求取消困难、超时重试未统一处理,且鸿蒙元服务对网络安全配置(如允许 HTTP 明文请求、权限声明)有特殊要求。若不封装,会导致大量重复代码、不一致的用户体验,甚...

 

1.1 问题说明

uniapp 开发鸿蒙元服务过程中,网络请求是数据交互的核心。尽管 uni.request 提供了跨平台能力,但直接使用仍存在诸多痛点:缺乏统一的请求拦截与响应拦截、错误处理分散、Loading 状态管理混乱、请求取消困难、超时重试未统一处理,且鸿蒙元服务对网络安全配置(如允许 HTTP 明文请求、权限声明)有特殊要求。若不封装,会导致大量重复代码、不一致的用户体验,甚至因鸿蒙配置不当导致请求失败

 

1.2 原因分析

· 缺乏拦截机制
每个请求都要重复添加 Token、处理错误码、显示 Loading,代码臃肿。

· 错误处理零散
网络超时、业务状态码(如 401)未集中处理,用户提示混乱。

· Loading 管理复杂
并发请求时 Loading 显示/隐藏需手动计数,易出错。

· 请求取消缺失
各页面卸载时未取消 pending 请求,造成资源浪费或报错。

· 鸿蒙网络配置特殊
需声明 ohos.permission.INTERNET 权限,且默认禁止 HTTP 明文请求,开发者容易遗漏。

1.3 解决思路

· 设计统一请求类
封装 uni.request,提供 request(options)get/post 快捷方法,内部统一处理拦截器、错误码、Loading、重试、取消。

· 支持拦截器
通过计数器控制全局 Loading 显示隐藏,避免并发问题。

· 自动 Loading 计数
将各平台返回的状态映射为 GRANTEDDENIEDNEVER_ASK_AGAIN,所有接口返回标准化状态,便于业务层判断。

· 统一错误处理
利用 AbortController requestTask.abort() 实现取消。

· 明确鸿蒙配置
在文档中给出 config.json 配置示例,确保网络请求在鸿蒙上正常运行。

1.4 解决方案

核心接口设计制

// src/utils/http.js 简化版

class Http {

  constructor() {

    this.interceptors = { request: [], response: [] }

  }

  useRequestInterceptor(fulfilled) { this.interceptors.request.push(fulfilled) }

  useResponseInterceptor(fulfilled) { this.interceptors.response.push(fulfilled) }

 

  async request(options) {

    // 合并默认配置:baseURL, timeout, retry, loading, showError等

    const config = { baseURL: '', timeout: 10000, retry: 2, loading: false, ...options }

    // 执行请求拦截器

    for (const interceptor of this.interceptors.request) {

      Object.assign(config, interceptor(config))

    }

    // 发起请求(带重试、loading、错误处理)

    return this._requestWithRetry(config)

  }

 

  get(url, data, options) { return this.request({ method: 'GET', url, data, ...options }) }

  post(url, data, options) { return this.request({ method: 'POST', url, data, ...options }) }

}

 

export const http = new Http()

拦截器与使用示例

javascript

// 入口配置

http.useRequestInterceptor(config => {

  const token = uni.getStorageSync('token')

  if (token) config.header = { ...config.header, Authorization: `Bearer ${token}` }

  return config

})

 

http.useResponseInterceptor(res => {

  if (res.statusCode === 200 && res.data.code === 0) return res.data.data

  throw { message: res.data.message || '请求失败', code: res.data.code }

})

 

// 页面调用

async fetchData() {

  try {

    const data = await http.get('/user/info', {}, { loading: true })

    this.user = data

  } catch (e) {

    // 错误已在内部统一提示,无需额外处理

  }

}

鸿蒙元服务网络配置

在鸿蒙元服务的 config.json 中添加:

 

json

{

  "module": {

    "reqPermissions": [{"name": "ohos.permission.INTERNET"}],

    "deviceConfig": {

      "default": {

        "network": {"cleartextTraffic": true}  // 调试时可允许HTTP

      }

    }

  }

}

 

1.5 总结

· 问题与痛点:网络请求缺少统一拦截、错误处理、Loading 管理、取消机制及鸿蒙配置复杂。

· 技术要点:封装统一请求类,支持拦截器、自动 Loading、重试、取消;明确鸿蒙网络配置要求。

· 实现效果:业务层调用简洁,代码复用率高,用户体验一致,鸿蒙元服务网络请求稳定。

· 适用场景:所有需要网络请求的 uniapp 项目,特别是多端适配(含鸿蒙元服务)的应用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。