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. 使用拦截器统一处理通用逻辑
相关推荐
80s77710 小时前
动态ip地址分配通常是由_动态IP与静态IP之间的区别
网络·网络协议·tcp/ip
无小道11 小时前
对称加密和非对称加密(小记)
网络·密码学
小懿互联集成平台11 小时前
金蝶云星空与兴业银行银企直连集成对接实施方案
网络·金蝶云星空·小懿互联·银企直联·兴业银行·数据对接方案
启博网络11 小时前
实战:无公网IP环境下的企业异地组网方案(附拓扑与IP规划)
linux·网络·tcp/ip
QYRdata11 小时前
权威数据锚定:2026-2032千兆以太网PHY年复合增长率5.5%
网络
qq_3957161711 小时前
RAID 相关操作,哪些操作会直接彻底销毁阵列数据?
服务器·网络·raid
数据知道12 小时前
国密算法实战——SM2/SM3/SM4 在国产系统中的应用
网络·算法·安全·网络安全·密码学·哈希算法
aiot1891893521812 小时前
核芯物联蓝牙AOA高精度定位生态合作案例分享金库定位踩坑实录
大数据·运维·网络·人工智能·蓝牙aoa
风合星语12 小时前
2026 机器人行业观察(一):现在入局机器人还来得及吗?——机会、门槛与技术人的切入点
网络·人工智能·机器人
m0_4598729212 小时前
网络基础
网络