uni-app 之 网络请求

uni-app 之 网络请求

uni-app 提供了多种网络请求方式,让开发者能够轻松实现与服务器的数据交互。

1. 基础网络请求 API

uni.request(OBJECT)

uni-app 最核心的网络请求 API,支持 Promise 化使用。

javascript 复制代码
// 基础用法
uni.request({
  url: "https://www.example.com/request",
  method: "GET",
  data: {
    key: "value",
  },
  success: (res) => {
    console.log(res.data);
  },
});

// Promise 方式
uni
  .request({
    url: "https://www.example.com/request",
    method: "POST",
    data: {
      name: "uni-app",
    },
  })
  .then((res) => {
    console.log(res.data);
  });

OBJECT 参数说明:

参数名 类型 必填 说明
url String 开发者服务器接口地址
data Object/String/ArrayBuffer 请求的参数
header Object 设置请求的 header
method String HTTP 请求方法,默认为 GET
dataType String 返回的数据格式,默认为 json
responseType String 响应的数据类型

2. 常用 HTTP 方法封装

javascript 复制代码
// GET 请求
function getRequest(url, data) {
  return uni.request({
    url: url,
    method: "GET",
    data: data,
  });
}

// POST 请求
function postRequest(url, data) {
  return uni.request({
    url: url,
    method: "POST",
    data: data,
    header: {
      "content-type": "application/json",
    },
  });
}

3. 全局请求配置

建议在项目中创建统一的请求管理文件:

javascript 复制代码
// api/request.js
const BASE_URL = "https://api.example.com";

function request(options) {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + options.url,
      method: options.method || "GET",
      data: options.data || {},
      header: {
        Authorization: uni.getStorageSync("token") || "",
        "Content-Type": "application/json",
      },
      success: (res) => {
        if (res.statusCode === 200) {
          resolve(res.data);
        } else {
          reject(res);
        }
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
}

export default {
  get(url, data) {
    return request({ url, method: "GET", data });
  },
  post(url, data) {
    return request({ url, method: "POST", data });
  },
  put(url, data) {
    return request({ url, method: "PUT", data });
  },
  delete(url, data) {
    return request({ url, method: "DELETE", data });
  },
};

4. 拦截器使用

uni-app 支持设置全局拦截器:

javascript 复制代码
// 请求拦截器
uni.addInterceptor("request", {
  invoke(args) {
    // 请求前统一处理
    args.header = args.header || {};
    args.header["Authorization"] = uni.getStorageSync("token") || "";
    return args;
  },
  success(result) {
    // 请求成功的处理
    return result;
  },
  fail(err) {
    // 请求失败的处理
    console.error("请求失败:", err);
  },
});

// 响应拦截器
uni.addInterceptor("request", {
  complete(result) {
    // 请求完成后的处理
    if (result.statusCode === 401) {
      // token过期处理
      uni.redirectTo({
        url: "/pages/login/login",
      });
    }
  },
});

5. 文件上传下载

文件上传 uni.uploadFile
javascript 复制代码
uni.chooseImage({
  success: (chooseImageRes) => {
    const tempFilePaths = chooseImageRes.tempFilePaths;
    uni.uploadFile({
      url: "https://www.example.com/upload",
      filePath: tempFilePaths[0],
      name: "file",
      formData: {
        user: "test",
      },
      success: (uploadFileRes) => {
        console.log(uploadFileRes.data);
      },
    });
  },
});
文件下载 uni.downloadFile
javascript 复制代码
uni.downloadFile({
  url: "https://www.example.com/file.pdf",
  success: (res) => {
    if (res.statusCode === 200) {
      console.log("下载成功");
    }
  },
});

6. WebSocket 连接

javascript 复制代码
// 创建 WebSocket 连接
uni.connectSocket({
  url: "wss://www.example.com/socket",
  success: () => {
    console.log("连接成功");
  },
});

// 监听 WebSocket 连接打开事件
uni.onSocketOpen((res) => {
  console.log("WebSocket连接已打开");

  // 发送消息
  uni.sendSocketMessage({
    data: "Hello Server",
  });
});

// 监听 WebSocket 接收到服务器的消息事件
uni.onSocketMessage((res) => {
  console.log("收到服务器内容:" + res.data);
});

// 关闭 WebSocket 连接
uni.closeSocket();

7. 网络状态监听

javascript 复制代码
// 获取网络状态
uni.getNetworkType({
  success: (res) => {
    console.log("当前网络类型:" + res.networkType);
  },
});

// 监听网络状态变化
uni.onNetworkStatusChange((res) => {
  console.log(
    "网络状态变化:" + res.isConnected + ", 网络类型:" + res.networkType
  );
});

8. 注意事项

  • 跨域问题:在小程序端不存在跨域问题,但在 H5 端需要注意跨域配置
  • HTTPS 要求:小程序端只能与 HTTPS 服务器通信
  • 请求限制:各平台对并发请求数量有限制
  • Header 设置:不同平台对 header 的支持可能有差异
  • 错误处理:建议统一处理网络请求错误情况

9. 最佳实践

  1. 封装统一的请求工具类
  2. 添加 loading 提示提升用户体验
  3. 统一处理 token 验证和刷新
  4. 实现请求重试机制
  5. 对请求参数进行统一校验
  6. 使用拦截器统一处理通用逻辑
相关推荐
皮皮学姐分享-ppx1 小时前
上市公司数字技术风险暴露数据(2010-2024)|《经济研究》同款大模型测算
大数据·网络·数据库·人工智能·chatgpt·制造
皮卡蛋炒饭.1 小时前
应用层协议HTTP
网络·网络协议·http
wearegogog1232 小时前
Modbus TCP 通讯协议实现
服务器·网络·tcp/ip
怀旧,2 小时前
【Linux网络编程】1. 网络基础概念
linux·网络
怀旧,2 小时前
【Linux网络编程】5. 应用层协议 HTTP
linux·网络·http
志栋智能3 小时前
超自动化巡检:量化运维成效的标尺
运维·网络·人工智能·自动化
夏日听雨眠3 小时前
Linux(信号,管道,共享内存)
java·服务器·网络
小辰记事本3 小时前
从零读懂RDMA UC Write:单向推送,不求回音
网络·网络协议·rdma
汤愈韬3 小时前
防火墙主备备份的非VRRP的三种模式
网络·网络安全·security
treesforest4 小时前
IP数据库下载完全指南:免费与商业IP定位库对比
网络·数据库·php