uniapp 系统学习,从入门到实战(七)—— 网络请求与数据交互

全篇大概 3600 字(含代码),建议阅读时间 25min


📚 目录

  1. 使用uni.request发起请求
  2. 封装全局请求工具
  3. 破解跨域难题
  4. 总结

在跨平台应用开发中,网络请求是连接前端与后端服务的核心环节。UniApp 提供了 uni.request 方法处理网络请求,但在实际项目中,我们还需要处理全局封装、错误处理和跨域等实际问题。本文将带您全面掌握 UniApp 网络请求的实战技巧。

1、使用 uni.request 发起请求

1.1 基本用法

uni.request 是 UniApp 的核心 API,支持所有主流平台。
基础用法如下:

// 发起 GET 请求
uni.request({
  url: '接口',
  method: 'GET',
  success: (res) => {
    console.log('响应数据:', res.data);
  },
  fail: (err) => {
    console.error('请求失败:', err);
  }
});
// 发起 POST 请求
uni.request({
  url: '接口',
  method: 'POST',
  data: { name: 'John', age: 25 },
  header: { 'Content-Type': 'application/json' },
  success: (res) => {
    console.log('提交成功:', res.data);
  }
});

1.2 实战示例:获取天气数据

function getWeather(city) {
  uni.request({
    url: '接口',
    data: { city: city },
    success: (res) => {
      if (res.statusCode === 200) {
        console.log('当前温度:', res.data.temperature);
      } else {
        uni.showToast({ title: '数据获取失败', icon: 'none' });
      }
    },
    fail: () => {
      uni.showToast({ title: '网络连接失败', icon: 'none' });
    }
  });
}

2. 封装全局请求工具

2.1 为什么要封装?

  • 统一处理错误加载状态
  • 集中管理请求头(如 Token)
  • 简化业务代码调用

2.2 完整封装方案

创建 utils/http.js

class HttpRequest {
  constructor() {
    this.baseUrl = '接口';
    this.timeout = 10000;
  }

  request(config) {
    return new Promise((resolve, reject) => {
      // 请求拦截
      const fullUrl = this.baseUrl + config.url;
      const header = this.getHeaders(config.headers);

      uni.request({
        url: fullUrl,
        method: config.method || 'GET',
        data: config.data,
        header: header,
        timeout: this.timeout,
        success: (res) => {
          // 响应拦截
          if (res.statusCode === 200) {
            resolve(res.data);
          } else {
            this.handleError(res);
            reject(res);
          }
        },
        fail: (err) => {
          this.handleError(err);
          reject(err);
        }
      });
    });
  }

  getHeaders(customHeaders) {
    const headers = {
      'Content-Type': 'application/json',
      'X-Client-Type': 'uniapp'
    };
    // 添加认证 Token
    const token = uni.getStorageSync('authToken');
    if (token) headers.Authorization = `Bearer ${token}`;
    
    return { ...headers, ...customHeaders };
  }

  handleError(error) {
    const status = error.statusCode;
    let message = '请求失败';
    
    if (status === 401) {
      message = '登录已过期';
      uni.navigateTo({ url: '/pages/login/login' });
    } else if (status >= 500) {
      message = '服务器异常,请稍后再试';
    }
    
    uni.showToast({ title: message, icon: 'none' });
  }

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

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

export default new HttpRequest();

2.3 使用示例

import http from '@/utils/http';

// 获取用户信息
async function fetchUser() {
  try {
    const user = await http.get('/user/profile');
    console.log('用户数据:', user);
  } catch (e) {
    console.error('请求异常:', e);
  }
}

// 提交表单
async function submitForm(data) {
  await http.post('/form/submit', data);
  uni.showToast({ title: '提交成功' });
}

3. 破解跨域难题

3.1 跨域原理

浏览器安全策略限制不同源(协议+域名+端口)的请求,主要影响H5端,小程序/App端无此限制。

3.2 解决方案对比

方案适用环境优点缺点
开发代理本地开发无需后端配合仅限开发环境
CORS生产环境标准解决方案需要后端配置
JSONP简单请求兼容旧浏览器仅支持GET
Nginx代理生产环境前端无需修改需服务器配置

3.3 实战配置指南

方案一:开发环境代理(HBuilderX)
配置 manifest.json

{
  "h5": {
    "devServer": {
      "proxy": {
        "/api": {
          "target": "接口",
          "changeOrigin": true,
          "pathRewrite": {"^/api": ""}
        }
      }
    }
  }
}

方案二:生产环境CORS
Node.js 示例:

// Express 中间件
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  next();
});

方案三:Nginx反向代理

server {
    listen 80;
    server_name 域名;

    location /api/ {
        proxy_pass 接口;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4. 总结

分层架构:通过封装实现业务逻辑与网络层的解耦

异常处理:统一处理401等状态码,增强用户体验

安全策略:HTTPS请求、Token刷新机制、请求签名

性能优化:合理设置超时时间(建议10-30秒),重要请求增加重试机制,大数据量使用分页加载

// 示例:请求重试机制
async function fetchWithRetry(url, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try {
      return await http.get(url);
    } catch (err) {
      if (i === retries - 1) throw err;
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
    }
  }
}

通过合理封装正确配置,可以在UniApp中构建稳定高效的网络请求体系。建议根据实际项目需求调整封装方案,并做好各平台的兼容性测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openEuler环境下GlusterFS分布式存储集群部署指南

1.环境准备&#xff1a; os&#xff1a;openEuler 22.03 主机名 IP地址 主机用途 Rocky8192.168.121.160客户端 open-Euler1192.168.121.150节点1&#xff0c;提供两块6G硬盘open-Euler4192.168.121.153节点2&#xff0c;提供两块6G硬盘open-Euler5192.168.121.154 …

网络空间安全(6)web应用程序技术

前言 Web应用程序技术是指用于开发和构建基于Web的应用程序的技术和工具&#xff0c;涵盖了前端开发、后端开发、数据库管理、安全性等多个方面的技术。 一、前端开发技术 HTML/CSS/JavaScript&#xff1a;HTML用于构建网页结构&#xff0c;CSS用于进行样式设计&#xff0c;Jav…

unity中找不到AI > Navgation

预制体中的Add Component 选中Agent Type -> Open Agent Setting跳出没有安装包的提示后,点击安装

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中&#xff0c;使用蓝牙电话拦截手机通话的声音&#xff0c;并对数据加工&#xff0c;这个功能出来也有一段时间了。前段时间有试用的用户咨询说&#xff1a;有没有办法在手机上&#xff…

LVGL -------矩阵3

static void event_cb(lv_event_t * e) { lv_obj_t * obj lv_event_get_target(e); uint32_t id lv_btnmatrix_get_selected_btn(obj); bool prev id 0 ? true : false; bool next id 6 ? true : false; if(prev || next) { /Find the checked button/ uint32_t i; for…

新建菜单项的创建之CmpGetValueListFromCache函数分析

第一部分&#xff1a; PCELL_DATA CmpGetValueListFromCache( IN PHHIVE Hive, IN PCACHED_CHILD_LIST ChildList, OUT BOOLEAN *IndexCached, OUT PHCELL_INDEX ValueListToRelease ) 0: kd> dv KeyControlBlock 0xe1…

大语言模型微调的基本概念介绍

大型语言模型&#xff08;LLMs&#xff09;正在以惊人的速度发展&#xff0c;LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤&#xff0c;今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。 大语言模型的生命周期 在深入了解大型语言模型&a…

三次握手内部实现原理

socket()创建一个新的套接字 int socket(int domain, int type, int protocol)&#xff1b; 参数&#xff1a; domain&#xff1a;地址族&#xff0c;如 AF_INET&#xff08;IPv4&#xff09;&#xff0c;AF_INET6&#xff08;IPv6&#xff09; type&#xff1a;套接字类型&…

【Mac】git使用再学习

目录 前言 如何使用github建立自己的代码库 第一步&#xff1a;建立本地git与远程github的联系 生成密钥 将密钥加入github 第二步&#xff1a;创建github仓库并clone到本地 第三步&#xff1a;上传文件 常见的git命令 git commit git branch git merge/git rebase …

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…

【前端基础】1、HTML概述(HTML基本结构)

一、网页组成 HTML&#xff1a;网页的内容CSS&#xff1a;网页的样式JavaScript&#xff1a;网页的功能 二、HTML概述 HTML&#xff1a;全称为超文本标记语言&#xff0c;是一种标记语言。 超文本&#xff1a;文本、声音、图片、视频、表格、链接标记&#xff1a;由许许多多…

Java---入门基础篇(下)---方法与数组

前言 本篇文章主要讲解有关方法与数组的知识点 ,是基础篇的一部分 , 而在下一篇文章我会讲解类和对象的知识点 入门基础篇上的链接给大家放在下面啦 ! Java---入门基础篇(上)-CSDN博客 感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 欢迎各位大佬指点…

论coding能力 new bing 对比 chatgpt

近日需要编程计算每个月的第二个星期二是哪一天&#xff0c;因为那一天需要做一件重要的事情&#xff0c;我想在这个日期做一个提醒&#xff0c;于是把这个重任交给当下最火的AI&#xff0c;微软new bing和chatGPT&#xff0c;实验对比结果如下&#xff1a;微软new bing会给你参…

C语言:51单片机 基础知识

一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等&#xff0c;具有一定规模的微型计算机。 特点&#xff1a; 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…

【计算机网络入门】初学计算机网络(六)

目录 1.回忆数据链路层作用 2. 组帧 2.1 四种组帧方法 2.1.1 字符计数法 2.1.2 字节填充法 2.1.3 零比特填充法 2.1.4 违规编码法 3. 差错控制 3.1 检错编码 3.1.1 奇偶校验码 3.1.2 CRC&#xff08;循环冗余校验&#xff09;校验码 3.2 纠错编码 3.2.1 海明校验码…

Materials Studio MS2020在linux系统上的安装包下载地址 支持centos Ubuntu rocky等系统

下载地址&#xff1a;MS2020-linux官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 Materials Studio 2020是一款功能强大的材料科学计算模拟软件&#xff0c;以下是其详细介绍&#xff1a; 核心模块功能 CASTEP模块&#xff1a;采用平面波赝势方法&#xff0c;适用于周…

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例&#xff1a;定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

初探Ollama与deepseek

什么是Ollama&#xff1f;它与大模型有什么联系&#xff1f; 简单说&#xff0c;Ollama就像是你电脑上的一个 “大模型小助手”。 以前&#xff0c;很多强大的大语言模型&#xff0c;比如能回答各种问题、写文章、翻译等的那些模型&#xff0c;要么只能在网上的服务器上用&am…

【word】保存重开题注/交叉引用消失,全局更新域问题

目录 一、更新域是什么二、更新域常见问题及解决方法&#xff08;一&#xff09;更新域后内容未变化&#xff08;二&#xff09;域代码显示异常&#xff08;三&#xff09;交叉引用无法更新&#xff08;四&#xff09;全选更新域出现错误 三、交叉引用与题注的关系及操作&#…

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石&#xff0c;它像区块链世界的身份证和防伪标签&#xff0c;确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言&#xff0c;带你彻底搞懂区块链中的数字签名&#xff01; 文章目录 1. 数字签名是什么&#xff1f;从现实世界到区块…