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. 使用拦截器统一处理通用逻辑
相关推荐
夏碧笔2 天前
uni-app跨端地图实战:用第三方LBS替代微信平台收费服务
uni-app
用户6990304848756 天前
try catch使用场景 处理同步代码错误兼容用的
javascript·uni-app
网络研究院7 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智7 天前
ARP代理--工作原理
运维·网络·arp·arp代理
ITKEY_7 天前
uniapp微信开发者工具 更改AppID失败 touristappid
uni-app
treesforest7 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_7 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
2601_961845157 天前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序猿阿伟7 天前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome
InHand云飞小白7 天前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器