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. 使用拦截器统一处理通用逻辑
相关推荐
Brookty2 小时前
应用层HTTP、安全层TLS与网络底层协议介绍
网络·http
Olivia051405142 小时前
Voohu:以太网隔离变压器的耐压与局部放电测试方法及判定标准
网络·安全·信息与通信
说再见再也见不到2 小时前
华为交换机端口隔离(port-isolate)
linux·服务器·网络·华为·交换机·端口隔离·port-isolate
克里斯蒂亚诺更新2 小时前
uniapp适配H5和Android-apk实现获取当前位置经纬度并调用接口
android·前端·uni-app
安静轨迹2 小时前
网口Bond模式详解:7种模式通俗解析
网络·网络协议
风曦Kisaki2 小时前
企业级网络架构Day02:数据链路层、交换机原理、VLAN技术、Trunk中继链路、链路聚合
网络·架构
上海控安2 小时前
汽车数字钥匙安全风险及渗透实践解析
网络·安全
汽车仪器仪表相关领域2 小时前
Kvaser Leaf Light HS v2 CB:裸卡式CAN接口新标杆,赋能车载与工业集成测试高效升级
服务器·网络·数据库·人工智能·单元测试·自动化·汽车
JoyCong19982 小时前
告别频繁输入密码!ToDesk自动解锁功能,实现远程办公“无感”连接
大数据·linux·服务器·网络·电脑·远程操作