人人都会AI编程

12.1 内置 HTTP 客户端:http 模块用法

更新时间:2026-07-11

在构建一个桌面应用时,几乎不可能避开网络请求。无论是获取远程配置、调用 REST API 还是上传文件,一个稳定且安全的 HTTP 客户端都是刚需。Tauri 2 并没有把这个功能塞进核心库,而是通过官方插件 @tauri-apps/plugin-http 提供了完整且受控的 HTTP 客户端支持——你既可以在 Rust 后端发送请求,也能在前端通过 JavaScript 直接调用,并且所有的请求都受到 Tauri 权限系统的严格约束。


启用 HTTP 插件

首先需要在项目中添加插件:

npm run tauri add http

这条命令会做三件事:

  • src-tauri/Cargo.toml 中添加 tauri-plugin-http 依赖;
  • src-tauri/src/lib.rs 中注册插件;
  • src-tauri/capabilities/ 下自动生成或更新权限配置,允许基础网络访问。

如果你需要更细粒度的 URL 范围控制,可以手动编辑权限文件(后文会讲到)。


前端直接发送请求

插件暴露了一个 fetch 函数,它的签名和浏览器原生的 fetch 非常相似,但经过了 Tauri 的安全管道:

import { fetch } from '@tauri-apps/plugin-http';

// GET 请求
const response = await fetch('https://api.example.com/data', {
  method: 'GET',
  headers: {
    'Accept': 'application/json',
  },
});

if (response.ok) {
  const data = await response.json();
  console.log(data);
}

// POST 请求
const postResponse = await fetch('https://api.example.com/submit', {
  method: 'POST',
  body: JSON.stringify({ name: 'Tauri' }),
  headers: {
    'Content-Type': 'application/json',
  },
});

注意:这里的 fetch 和浏览器原生的最大区别在于 它不受跨域限制。因为请求实际由 Rust 后端发出,绕过了 WebView 的同源策略。这对调用第三方 API 尤其方便。


在 Rust 端发送请求

如果你想在后端处理请求逻辑(例如需要对返回数据进行二次处理,或结合系统状态),可以在 Rust 中使用插件提供的 reqwest 重新导出的客户端:

use tauri_plugin_http::reqwest;

#[tauri::command]
async fn fetch_data() -> Result<String, String> {
    let client = reqwest::Client::new();
    let res = client
        .get("https://api.example.com/data")
        .send()
        .await
        .map_err(|e| e.to_string())?;

    let body = res.text().await.map_err(|e| e.to_string())?;
    Ok(body)
}

前端调用这个命令就能间接发起请求。这种方式的好处是请求完全对前端透明,可以在 Rust 层做加密、签名、缓存等额外操作。


安全:请求作用域控制

HTTP 插件默认不允许访问任意 URL,你需要在权限文件(src-tauri/capabilities/default.json 或自定义文件)中显式声明允许的网址范围:

{
  "identifier": "default",
  "windows": ["main"],
  "permissions": [
    "http:default",
    {
      "identifier": "http:default",
      "allow": [
        { "url": "https://api.example.com/**" },
        { "url": "https://*.mycdn.io/**" }
      ],
      "deny": [
        { "url": "https://api.example.com/admin/**" }
      ]
    }
  ]
}
  • 可以用通配符 ** 匹配路径;
  • deny 的优先级高于 allow,可以方便地屏蔽敏感子路径;
  • 如果请求的 URL 不在允许范围内,前端 fetch 或后端请求都会直接报错,从源头杜绝了恶意请求。

实际应用建议

  • 本地开发 时如果不想频繁改权限文件,可以临时打开 http:allow-everything 权限,但生产环境务必收紧;
  • 文件上传/下载可以直接用 fetch 处理 ReadableStreamFormData,与浏览器用法一致;
  • 如果需要进度监听,可以利用 fetch 返回的 Response.body 配合 ReadableStream 手动计算进度。

一句话总结:Tauri 的 HTTP 插件是一个安全加成的、跨域无感的请求工具,无论从 JavaScript 还是 Rust 端调用,都能在权限网格的守护下自由访问网络资源,同时保持应用体积的轻量。