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. 使用拦截器统一处理通用逻辑
相关推荐
xixiaoyunya21 小时前
内网穿透工具选型分析:从 ngrok 的局限性看国内开发场景下的替代方案
网络
FreeTinker21 小时前
远程查看的技术路径与工程选型分析
网络
YXXY3131 天前
网络基础2(三)
网络
m24tyy1 天前
常见空间测绘搜索引擎介绍和使用以及子域名的收集
网络·测试工具·搜索引擎
数据安全技术观察1 天前
数据动态脱敏:让脱敏策略跟着数据目录走
大数据·网络·数据库
我爱cope1 天前
【计算机网络 | 网络层1:网络层的职责:IP 协议究竟解决了什么问题?】
网络·tcp/ip·计算机网络
dogstarhuang1 天前
OpenAI GPT-5.6 降价后如何重算 API 账单?多模型路由与成本治理实战
服务器·网络·人工智能·大模型·api·ai应用开发·接口管理
苏宸啊1 天前
linux网络编程udp服务器和客户端代码编写(echo版本和字典版本)
linux·网络
奇树谦1 天前
HDD 为什么适合顺序大文件读写:从 RAID 5 到 RAID 50 的原理与性能分析
linux·运维·网络
嵌入式阿蔡1 天前
Linux_01:交叉编译与开发环境实战——从单片机跨到 Linux 的第一道坎
linux·运维·网络·单片机·嵌入式硬件·嵌入式实时数据库